Операционные системы. Программирование в операционной среде Windows
14 BOOL GetExitCodeProcess ( HANDLE hProcess, PDWORD pdwExitCode) ; Родительский процесс получает код завершения как значение типа DWORD, на которое указывает параметр pdwExitCode. 1.8. Дочерние процессы В приложениях часто присутствуют достаточно самостоятельные блоки кода. Для их выполнения можно создать подпрограмму, поток или дочерний процесс. Вызов подпрограммы приводит к приостановке выполнения основного кода программы до возврата из вызванной подпрограммы. Создание потока в пределах данного процесса позволит основному коду программы продолжить работу в то время, как дополнительный поток будет выполнять другую операцию. Но, когда основному потоку потребуется узнать результаты работы другого потока, возникают проблемы, связанные с синхронизацией. Более того, если поток работает некорректно, то не исключена возможность случайной перезаписи данных в адресном пространстве своего процесса. Для того, чтобы защитить адресное пространство основного процесса от подобных ошибок, можно создать дочерний процесс и передать ему часть работы. Далее можно или подождать, пока дочерний процесс завершится, или продолжить работу параллельно с ним. Если необходимо создать новый процесс и заставить его выполнить какие-либо операции и дождаться их результатов, можно использовать следующий фрагмент кода: STARTUPINFOA si = { sizeof(si) }; PROCESS_INFORMATION pi; DWORD dwExitCode; // Порождение дочернего процесса BOOL fSuccess = CreateProcessA(...,&si, &pi); if (fSuccess) { // Закрытие дескриптора потока как только он не нужен CloseHandle(pi.hThread); // Приостановка главного процесса до завершения дочернего WaitForSingleObject(pi.hProcess, INFINITE); // Дочерний процесс завершен, получение кода завершения GetExitCodeProcess(pi.hProcess, &dwExitCode); // Закрытие дескриптора процесса, так как он больше не нужен CloseHandle(pi.hProcess); } В этом фрагменте кода создали новый процесс и, если это прошло успешно, вызвали функцию WaitForSingleObject. DWORD WaitForSingleObject(HANDLE hObject, DWORD dwTimeOut);
Made with FlippingBook
RkJQdWJsaXNoZXIy MTY0OTYy