![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
CreateProcess
Duncan © (2003-07-28 15:08:00)
Как отследить, что завершился процесс созданный при помощи CreateProcess (вызывает дос-окошко). Спасибо.
Набережных С. (2003-07-29 17:34:00) [1]
>Duncan (29.07.03 09:58)
Ну, твое дело. "Я прокукарекал, а там хоть не рассветай"
Duncan (2003-07-29 09:58:00) [2]
>ZZ
Спасибо, за небольшое уточнение, но время все-равно надо уменьшать :-).
>Набережных С.
Результатом вызова CreateProcess является, в моем случае, файл на диске с которым будет работать другая прога. Поэтому задача состоит в том, чтоб запустить CreateProcess, а по его завершению запустить еще раз. Поэтому очень важно освобождать память :-).
Набережных С. (2003-07-28 20:58:00) [3]
Я не об этом. Если для программы не имеет значение результат вызова CreateProcess, то зачем вообще ее вызывать? А если дальнейший код основывается на предположении, что CreateProcess отработала нормально, то к чему это приведет неизвестно.
ZZ (2003-07-28 20:44:00) [4]
Ну мы можем либо создать процесс, либо нет. И проверка CreateProcess имхо абсолютно ничего не дает...
WaitForSignleObject отработает в любом случае
CloseHandle тоже ничего фатального не сделают, а дальше про CreateProcess можно забыть (ProcessInformation уже "закрыто")
Набережных С. (2003-07-28 20:31:00) [5]
Да любые. Этот код ведь не сам по себе будет существовать. Не контролируя результат вызова CreateProcess, можно получить что угодно.
ZZ (2003-07-28 20:17:00) [6]
Какие, если не секрет?
Набережных С. (2003-07-28 20:13:00) [7]
>Баги не возможны в принципе
Возможны. Еще как.
ZZ (2003-07-28 19:59:00) [8]
DWORD WaitForSingleObject(
HANDLE hHandle, // handle to object
DWORD dw Milliseconds // time-out interval
);
dwMilliseconds
[in] Specifies the time-out interval, in milliseconds.
Duncan (2003-07-28 19:57:00) [9]
Да сутки, т.к. в доке написано вроде, что WaitForSingleObject реагирует либо на завершение процесса, либо на окончание таймера, вот поэтому я так и поставил. Сам процесс в среднем действует около 3 минут.
ZZ (2003-07-28 19:50:00) [10]
Баги не возможны в принципе.. А вот недокументированные фичи появятся :)) Проверяй что возвращают функции... хотя можно и без этого.
WaitForSignleObject(ProcessInformation.hProcess, 3600*24)=WAIT_OBJECT_0)
Выделенное жирным шрифтом время - это сколько по твоему? Сутки?
Duncan (2003-07-28 19:40:00) [11]
А какой код является в данном случае более правильным?
Набережных С. (2003-07-28 18:53:00) [12]
При такомкоде может быть все, что угодно
Duncan (2003-07-28 18:13:00) [13]
pr - c обратным слешем, проблем с запуском нет, т.е. все идет нормально. Вопрос стоит именно в завершении приложении. При таком коде я действительно смогу поймать момент окончания работы процесса и всю ли память освобожу??
Набережных С. (2003-07-28 17:46:00) [14]
Проверяй, что возвращает CreateProcess и есть ли завершающий слэш в pr.
Duncan (2003-07-28 15:40:00) [15]При использовании следующего кода баги возможны? Если да, то где?
GetStartupInfo(StartupInfo);
with StartupInfo ( nil, PChar(pr+"a.bat")При использовании следующего кода баги возможны? Если да, то где?
GetStartupInfo(StartupInfo);
with StartupInfo do begin
wShowWindow := SW_HIDE; //не показывать окно
dwFlags := STARTF_USESHOWWINDOW; end;
CreateProcess(nil, PChar(pr+"a.bat"), nil, nil, FALSE, CREATE_NEW_CONSOLE, nil, nil, StartupInfo, ProcessInformation);
if (WaitForSignleObject(ProcessInformation.hProcess,3600*24)=WAIT_OBJECT_0)
then ShowMessage("ok")
else ShowMessage("bad luck");
CloseHandle(ProcessInformation.hProcess);
CloseHandle(ProcessInformation.hThread);
Polevi (2003-07-28 15:19:00) [16]
WaitForSignleObject(hProcess)