mutex (VC++)
От: ashot  
Дата: 17.05.04 10:19
Оценка:
короче говоря, проблема в следующем — пишу программу которая создаёт цепочку из процессов.
То есть её задача такова — указываем первый процесс, второй процесс, и тд, потом жмем кнопку запустить — запускается первый процесс. Программа должна отслеживать, когда этот процесс закончит работу, и запускать следующий процесс.
На данном этапе это реализовано через GetExitCodeProcess таким образом:

CreateProcess(NULL, strCurrentName1, NULL,NULL,TRUE,0,NULL,NULL,&si,&pi);
DWORD q;
GetExitCodeProcess(pi.hProcess,&q);
while (q==STILL_ACTIVE)
GetExitCodeProcess(pi.hProcess,&q);
CreateProcess(NULL, strCurrentName2, NULL,NULL,TRUE,0,NULL,NULL,&si,&pi);

вот тут-то и порылась собака — во время работы первого процесса моя прога подвисает наглухо из-за цикла.
а как можно сделать, чтобы моя программа ждала события от первого процесса, переходила в режим wait? Мне посоветовали использовать для этих целей mutex, но я с ним разобраться пока не могу.
Re: mutex (VC++)
От: kmn Украина  
Дата: 17.05.04 10:24
Оценка:
Здравствуйте, ashot, Вы писали:

CreateProcess(NULL, strCurrentName1, NULL,NULL,TRUE,0,NULL,NULL,&si,&pi);
DWORD q;
::WaitForSingleObject(pi.hProcess, INFINITY);
GetExitCodeProcess(pi.hProcess,&q);
...
Re: mutex (VC++)
От: SergeMukhin Россия  
Дата: 17.05.04 10:27
Оценка:
Здравствуйте, ashot, Вы писали:

A>вот тут-то и порылась собака — во время работы первого процесса моя прога подвисает наглухо из-за цикла.

A>а как можно сделать, чтобы моя программа ждала события от первого процесса, переходила в режим wait? Мне посоветовали использовать для этих целей mutex, но я с ним разобраться пока не могу.

вот пример из MSDN


void main( VOID )
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

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

    // Start the child process. 
    if( !CreateProcess( NULL, // No module name (use command line). 
        "MyChildProcess", // 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.
    ) 
    {
        ErrorExit( "CreateProcess failed." );
    }

    // Wait until child process exits.
    WaitForSingleObject( pi.hProcess, INFINITE );
    // Close process and thread handles. 
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );
}
---
С уважением,
Сергей Мухин
Re: mutex (VC++)
От: rus blood Россия  
Дата: 17.05.04 10:29
Оценка:
A>CreateProcess(NULL, strCurrentName1, NULL,NULL,TRUE,0,NULL,NULL,&si,&pi);
A>DWORD q;
A>GetExitCodeProcess(pi.hProcess,&q);
A>while (q==STILL_ACTIVE)
A> GetExitCodeProcess(pi.hProcess,&q);
A>CreateProcess(NULL, strCurrentName2, NULL,NULL,TRUE,0,NULL,NULL,&si,&pi);

A>вот тут-то и порылась собака — во время работы первого процесса моя прога подвисает наглухо из-за цикла.

A>а как можно сделать, чтобы моя программа ждала события от первого процесса, переходила в режим wait? Мне посоветовали использовать для этих целей mutex, но я с ним разобраться пока не могу.


1. Если очень хочется использовать такой цикл, вставь что-нить типа Sleep(10); — нагрузка на процессор упадет.
2. Handle процесса является wait-объектом. Т.е. можешь использовать так


CreateProcess(NULL, strCurrentName1, NULL,NULL,TRUE,0,NULL,NULL,&si,&pi);
WaitForSingleObject(pi.hProcess, ...);

CreateProcess(NULL, strCurrentName2, NULL,NULL,TRUE,0,NULL,NULL,&si,&pi);


и не использовать никаких мьютексов.

3. По поводу mutex-ов. В своем приложении создаешь mutex (хотя лучше event). У него можно задать имя, а по этому имени — открыть в другом процессе (OpenMutex, OpenEvent). Т.е. твои дочерние процессы открывают этот mutex (или event) по имени, и по окончании работы "сигналят" им.
Имею скафандр — готов путешествовать!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.