Как я могу запустить дочерний процесс Java в Windows? - PullRequest
4 голосов
/ 14 июня 2019

У меня есть программа для Windows, написанная на C (скажем, launcher) и приложение на основе javaFX, упакованное в *jar (payload).Я хочу добиться чего-то похожего на то, как ведет себя IntelliJ IDEA в JetBrains.Я имею в виду, что в диспетчере задач мы можем видеть процесс «дерево» или «папку», например: Windows Task Manager

Однако в моем случае я вижу два совершенно независимых процесса: launcher.exe (только в разделе [Details]) и Java (TM) Platform SE binary в разделе [Processes] (на самом деле это мой payload).

Я использую функцию CreateProcessW для запуска моего процесса.В моем коде:

STARTUPINFOW info = { sizeof(info) };
PROCESS_INFORMATION processInfo;

CreateProcessW(L"C:\\Path\\To\\java.exe", L" -jar C:\\Path\\To\\payload.jar",
    NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &info, &processInfo);

Как я могу сделать мое java-приложение более "родным" в диспетчере задач?Я использую jdk1.8.0_172.Спасибо за помощь.

1 Ответ

1 голос
/ 25 июня 2019

Чтобы создать «дерево» или «папку» процесса, подобное отображаемому в диспетчере задач, необходимо выполнить два следующих требования:

  1. Процессы в дереве выполняют одну и ту же программу / приложение (сгруппировано по приложению).
  2. Между этими процессами есть родительско-дочерние отношения. Там родительский процесс запускает другие процессы, которые являются дочерними процессами. (Чтобы проверить отношения родитель-потомок, вы можете использовать инструмент Process Explorer .)

В вашем случае, хотя launcher.exe и java.exe (payload.jar) имеют отношения родитель-потомок, но не являются одной и той же программой / приложением, поэтому они не могут находиться в «дереве» или «папке процесса». 'в диспетчере задач.

См. " О процессах и потоках " " Дочерние процессы "

Чтобы продемонстрировать, как создать «дерево процессов», я создаю следующую демонстрацию: консольное приложение win32. (Запустите TestGroupProcesses.exe, каждый раз, когда вы нажимаете Enter, он создает дочерний процесс в дереве процессов.)

#include <windows.h>
#include <stdio.h>

int main()
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(&pi, sizeof(pi));

    printf("Press Enter to create the child process\n");

    while (getchar() != '\n');

    // Start the child process. 
    if (!CreateProcess(NULL,   // No module name (use command line)
        GetCommandLine(),        // Command line
        NULL,           // Process handle not inheritable
        NULL,           // Thread handle not inheritable
        FALSE,          // Set handle inheritance to FALSE
        0,              // No creation flags
        NULL,           // Use parent's environment block
        NULL,           // Use parent's starting directory 
        &si,            // Pointer to STARTUPINFO structure
        &pi)           // Pointer to PROCESS_INFORMATION structure
        )
    {
        printf("CreateProcess failed (%d).\n", GetLastError());
    }

    // Wait until child process exits.
    WaitForSingleObject(pi.hProcess, INFINITE);

    // Close process and thread handles. 
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
}

Процесс "дерево", созданный в приведенной выше демонстрации, выглядит следующим образом:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...