Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Подождать завершения внешнего модуля.

295
14 января 2003 года
gray_k
356 / / 20.12.1999
Такая проблема.
Я архивирую файлы, лежащие в некоторой директории с пормощью ShellExecutre(Handle, WinRAR,...).
После архивации надо удалить директорию со всеми файлами. Но хоть и код удаления стоит после ShellExecute, удаление директории происходит до того, как WinRAR всё успеет заархивировать. Как бы подождать, пока он выполнится?
2.0K
14 января 2003 года
D. Lex
45 / / 09.10.2002
Цитата:
Originally posted by gray_k
Такая проблема.
Я архивирую файлы, лежащие в некоторой директории с пормощью ShellExecutre(Handle, WinRAR,...).
После архивации надо удалить директорию со всеми файлами. Но хоть и код удаления стоит после ShellExecute, удаление директории происходит до того, как WinRAR всё успеет заархивировать. Как бы подождать, пока он выполнится?



См. WaitForSingleObject(Ex), WaitForMultipleObjetcs(Ex).

3
14 января 2003 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by D. Lex


См. WaitForSingleObject(Ex), WaitForMultipleObjetcs(Ex).



Только используй не SShellExecutre, а CreateProcess

1.8K
14 января 2003 года
ALI
129 / / 10.01.2003
чтото в духе:
Код:
DWORD ExecAndWait(AnsiString FileName,AnsiString Params,AnsiString cd,int Visible)
{

        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;
}

точно не помню работает или нет
слишком давно писал
1.7K
15 января 2003 года
Mark
114 / / 21.11.2002
Цитата:
Originally posted by ALI
чтото в духе:
Код:
DWORD ExecAndWait(AnsiString FileName,AnsiString Params,AnsiString cd,int Visible)
{

        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? Как это будет работать (какие варианты) в случае, если созданный процесс сам любит создавать процессы?

1.8K
15 января 2003 года
ALI
129 / / 10.01.2003
Цитата:
Originally posted by Mark


Поправьте, если не прав. WaitForSingleObject возвращает (в вольном переводе) либо "отвали - это мутекс", либо "объект в состоянии", либо "недождался". Что вернется, если процесс уже убит? Указывая dwMilliseconds как INFINITE можно не дождаться никогда? Если можно, то в каких случаях и из каких соображений тогда выбирать значение dwMilliseconds? Как это будет работать (какие варианты) в случае, если созданный процесс сам любит создавать процессы?



Это всего лишь один из вариантов реализации
можно заменить

 
Код:
WaitForSingleObject(pi.hProcess,INFINITE);
GetExitCodeProcess(pi.hProcess,&res);


на WaitForSingleObject в циклe while поставить вместо INFINITE какое либо значение
Добавить в цикл Application->ProcessMesages();
и завершение процесса по требованию пользователя
через TerminateProcess и приостановку по требованию с помощю SuspendThread и ResumeThread
1.7K
15 января 2003 года
Mark
114 / / 21.11.2002
Цитата:
Originally posted by ALI


Это всего лишь один из вариантов реализации
можно заменить
 
Код:
WaitForSingleObject(pi.hProcess,INFINITE);
GetExitCodeProcess(pi.hProcess,&res);


на WaitForSingleObject в циклe while поставить вместо INFINITE какое либо значение
Добавить в цикл Application->ProcessMesages();
и завершение процесса по требованию ползователя
через TerminateProcess и приостановку по требованию с помощю SuspendThread и ResumeThread


Понял.

1.8K
15 января 2003 года
ALI
129 / / 10.01.2003
Цитата:
Originally posted by Mark

Понял.


да кстати еще можно юзать TLauncher
из Polaris Library или
если вернуться к первоначальной задаче
то можно запукать rar с ключем
"удалить файлы после архивации"
тогда и каталог удалять не надо:)
а проверка на дождался или нет
просто проверять на сущевствование каталога

2.0K
20 января 2003 года
segev
67 / / 19.01.2003
Mark
WaitForSingleObject возвращает либо "Объект в состоянии", либо "не дождался" (таймаут), либо ошибку. Мьютекс - это такой же объект как и все остальные.
Если процесс завершен, WaitForSingleObject вернет "Объект в состоянии".

ALI
Цитата:

на WaitForSingleObject в циклe while поставить вместо INFINITE какое либо значение
Добавить в цикл Application->ProcessMesages();
и завершение процесса по требованию пользователя
через TerminateProcess и приостановку по требованию с помощю SuspendThread и ResumeThread.


Что это и зачем :-?

1.7K
21 января 2003 года
Mark
114 / / 21.11.2002
Цитата:
Originally posted by segev

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.


- это то, что я имел в виду по-поводу мутексов.
Если процесс завершен, а функция возвращает "в состоянии", то подход не верен в принципе? Тогда в каких случаях объект не "в состоянии"?

1.7K
21 января 2003 года
Mark
114 / / 21.11.2002
Да, действительно. Там же:

The CreateProcess or OpenProcess function returns the handle. A process object's state is signaled when the process terminates.

Догнал и согласен.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог