Как правильнее следить за child процессом
От: C0x  
Дата: 17.10.18 15:59
Оценка:
Есть Лаунчер. Он стартует некое приложение и скрывается из виду. Нужно как только дочерний процесс завершиться показать лаунчер снова.

Пока делаю так в Лаунчере:

0. ::ShowWindow(parentHwnd, SW_HIDE);
1. RunProcess(path, args);
2.

RepeatOnTimeout([parentHwnd]()->bool {
                //работает в отдельном потоке

                if (CheckProcessExists(L"child.exe"))
                {

                    return true;
                }
                //if ended
                ::ShowWindow(parentHwnd, SW_SHOW);
                return false;
            }, 1000);


Как можно это сделать более правильно?

RunProcess такой:


void RunProcess(const wstring &path, const wstring &args)
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    HANDLE g_hChildStd_OUT_Rd = NULL;
    HANDLE g_hChildStd_OUT_Wr = NULL;

    SECURITY_ATTRIBUTES saAttr;

    ZeroMemory(&saAttr, sizeof(SECURITY_ATTRIBUTES));
    memset(&saAttr, 0, sizeof(SECURITY_ATTRIBUTES));
    saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
    //saAttr.bInheritHandle = TRUE;
    //saAttr.lpSecurityDescriptor = NULL;



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

    //si.hStdError = g_hChildStd_OUT_Wr;
    //si.hStdOutput = g_hChildStd_OUT_Wr;
    //si.dwFlags |= STARTF_USESTDHANDLES;


    
    wstring cmdLine = WStrF(L"\"%s\" %s", path.c_str(), args.c_str());
    WCHAR buff[4096];
    wcscpy(buff, cmdLine.c_str());

    BOOL ret = CreateProcess(NULL, buff,
        NULL,
        NULL,
        TRUE,
        NULL,
        NULL,
        NULL,
        &si,
        &pi); 

    if (!ret)
    {
        throw exception("Failed to run process");
    }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.