Подождать завершения внешнего модуля.
Я архивирую файлы, лежащие в некоторой директории с пормощью ShellExecutre(Handle, WinRAR,...).
После архивации надо удалить директорию со всеми файлами. Но хоть и код удаления стоит после ShellExecute, удаление директории происходит до того, как WinRAR всё успеет заархивировать. Как бы подождать, пока он выполнится?
Такая проблема.
Я архивирую файлы, лежащие в некоторой директории с пормощью ShellExecutre(Handle, WinRAR,...).
После архивации надо удалить директорию со всеми файлами. Но хоть и код удаления стоит после ShellExecute, удаление директории происходит до того, как WinRAR всё успеет заархивировать. Как бы подождать, пока он выполнится?
См. WaitForSingleObject(Ex), WaitForMultipleObjetcs(Ex).
См. WaitForSingleObject(Ex), WaitForMultipleObjetcs(Ex).
Только используй не SShellExecutre, а CreateProcess
{
DWORD res;
STARTUPINFO si;
PROCESS_INFORMATION pi;
memset(&si, 0, sizeof(STARTUPINFO));
si.cb = sizeof(si);
si.wShowWindow = Visible;
si.dwFlags = STARTF_USESHOWWINDOW;
if (!CreateProcess(FileName.c_str(),
NULL,
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&si,
&pi))
{
res=-1;
}
else
{
WaitForSingleObject(pi.hProcess,INFINITE);
GetExitCodeProcess(pi.hProcess,&res);
}
return 0;
}
точно не помню работает или нет
слишком давно писал
чтото в духе:
{
DWORD res;
STARTUPINFO si;
PROCESS_INFORMATION pi;
memset(&si, 0, sizeof(STARTUPINFO));
si.cb = sizeof(si);
si.wShowWindow = Visible;
si.dwFlags = STARTF_USESHOWWINDOW;
if (!CreateProcess(FileName.c_str(),
NULL,
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&si,
&pi))
{
res=-1;
}
else
{
WaitForSingleObject(pi.hProcess,INFINITE);
GetExitCodeProcess(pi.hProcess,&res);
}
return 0;
}
точно не помню работает или нет
слишком давно писал
Поправьте, если не прав. WaitForSingleObject возвращает (в вольном переводе) либо "отвали - это мутекс", либо "объект в состоянии", либо "недождался". Что вернется, если процесс уже убит? Указывая dwMilliseconds как INFINITE можно не дождаться никогда? Если можно, то в каких случаях и из каких соображений тогда выбирать значение dwMilliseconds? Как это будет работать (какие варианты) в случае, если созданный процесс сам любит создавать процессы?
Поправьте, если не прав. WaitForSingleObject возвращает (в вольном переводе) либо "отвали - это мутекс", либо "объект в состоянии", либо "недождался". Что вернется, если процесс уже убит? Указывая dwMilliseconds как INFINITE можно не дождаться никогда? Если можно, то в каких случаях и из каких соображений тогда выбирать значение dwMilliseconds? Как это будет работать (какие варианты) в случае, если созданный процесс сам любит создавать процессы?
Это всего лишь один из вариантов реализации
можно заменить
GetExitCodeProcess(pi.hProcess,&res);
на WaitForSingleObject в циклe while поставить вместо INFINITE какое либо значение
Добавить в цикл Application->ProcessMesages();
и завершение процесса по требованию пользователя
через TerminateProcess и приостановку по требованию с помощю SuspendThread и ResumeThread
Это всего лишь один из вариантов реализации
можно заменить
GetExitCodeProcess(pi.hProcess,&res);
на WaitForSingleObject в циклe while поставить вместо INFINITE какое либо значение
Добавить в цикл Application->ProcessMesages();
и завершение процесса по требованию ползователя
через TerminateProcess и приостановку по требованию с помощю SuspendThread и ResumeThread
Понял.
Понял.
да кстати еще можно юзать TLauncher
из Polaris Library или
если вернуться к первоначальной задаче
то можно запукать rar с ключем
"удалить файлы после архивации"
тогда и каталог удалять не надо:)
а проверка на дождался или нет
просто проверять на сущевствование каталога
WaitForSingleObject возвращает либо "Объект в состоянии", либо "не дождался" (таймаут), либо ошибку. Мьютекс - это такой же объект как и все остальные.
Если процесс завершен, WaitForSingleObject вернет "Объект в состоянии".
ALI
на WaitForSingleObject в циклe while поставить вместо INFINITE какое либо значение
Добавить в цикл Application->ProcessMesages();
и завершение процесса по требованию пользователя
через TerminateProcess и приостановку по требованию с помощю SuspendThread и ResumeThread.
Что это и зачем :-?
WaitForSingleObject возвращает либо "Объект в состоянии", либо "не дождался" (таймаут), либо ошибку. Мьютекс - это такой же объект как и все остальные.
Если процесс завершен, WaitForSingleObject вернет "Объект в состоянии".
Цитирую:
The WaitForSingleObject function returns when one of the following occurs:
· The specified object is in the signaled state.
· The time-out interval elapses.
DWORD WaitForSingleObject(
HANDLE hHandle, // handle of object to wait for
DWORD dwMilliseconds // time-out interval in milliseconds
);
и далее:
Return Values
If the function succeeds, the return value indicates the event that caused the function to return.
If the function fails, the return value is WAIT_FAILED. To get extended error information, call GetLastError.
The return value on success is one of the following values:
Value Meaning
WAIT_ABANDONED The specified object is a mutex object that was not released by the thread that owned the mutex object before the owning thread terminated. Ownership of the mutex object is granted to the calling thread, and the mutex is set to nonsignaled.
WAIT_OBJECT_0 The state of the specified object is signaled.
WAIT_TIMEOUT The time-out interval elapsed, and the object's state is nonsignaled.
- это то, что я имел в виду по-поводу мутексов.
Если процесс завершен, а функция возвращает "в состоянии", то подход не верен в принципе? Тогда в каких случаях объект не "в состоянии"?
The CreateProcess or OpenProcess function returns the handle. A process object's state is signaled when the process terminates.
Догнал и согласен.