|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
04.04.2008, 10:11 | #1 |
Пользователь
Регистрация: 24.10.2007
Сообщений: 19
|
Приостановка цикла для выполнения внешней программы
Есть вот такой код:
if FindFirst('D:\FES\' + '2z???_09.900', faAnyFile - faDirectory,fl) = 0 then begin repeat begin Name900:= fl.Name; RenameFile('D:\FES\'+Name900,'D:\FE S\Tmp\' + 'Archiv.cab'); ShellExecute(Handle, nil, 'cmd.exe', '/c '+'C:\ARJ32\CABARC.EXE x D:\FES\Tmp\Archiv.cab D:\FES\', nil, SW_SHOW); end; until FindNext(fl) <> 0; end; Не подскажите как можно осуществить возможность, чтобы вызываемый архиватор выполнял разархивирование, а уже затем продолжалось выполение цикла. А то получается если в директории находится несколько файлов архиватор не успевает их обработать. |
04.04.2008, 10:28 | #2 |
Форумчанин
Регистрация: 29.12.2007
Сообщений: 137
|
Вместо ShellExecute - CreateProcess и дождаться окончания вызовом WaitForSingleObject.
ЗЫ: Утечка ресурсов - ты FindClose забыл |
04.04.2008, 10:40 | #3 |
Пользователь
Регистрация: 24.10.2007
Сообщений: 19
|
Ins, спасибо!
Да я нашел код с CreateProcess: FillChar(si,SizeOf(si),0); si.cb:=SizeOf(si); CreateProcess(nil,'zzz.exe',nil,nil ,false,0,nil,ni l,si,pi); CloseHandle(pi.hThread); WaitForSingleObject(pi.hProcess,INF INITE); CloseHandle(pi.hProcess); Просто хотелось узнать есть ли возможность приостанавливать программу в данном варианте кода. FindClose, не забыл.. дальше fl : TSearchRec; снова используется |
04.04.2008, 11:48 | #4 |
Пользователь
Регистрация: 24.10.2007
Сообщений: 19
|
Var
Name900, NameArj, PatchArc, PatchTmp : String; Rlst: LongBool; StartUpInfo: TStartUpInfo; ProcessInfo: TProcessInformation; Error: integer; ExitCode: Cardinal; begin FillChar(StartUpInfo, SizeOf(TStartUpInfo), 0); PatchTmp:= 'D:\FES\Tmp\'; if FindFirst('D:\FES\' + '2z???_09.900', faAnyFile - faDirectory,fl) = 0 then begin repeat begin Name900:= fl.Name; PatchArc:= 'D:\FES\'+Name900; RenameFile(PatchArc,PatchTmp + 'Archiv.cab'); begin FillChar(StartUpInfo, SizeOf(TStartUpInfo), 0); with StartUpInfo do begin cb := SizeOf(TStartUpInfo); dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK; wShowWindow := SW_SHOWNORMAL; end; Rlst := CreateProcess(nil, 'cmd.exe /c C:\ARJ32\CABARC.EXE x D:\FES\Tmp\Archiv.cab D:\FES\', nil, nil, false, NORMAL_PRIORITY_CLASS, nil, nil, StartUpInfo, ProcessInfo); if Rlst then with ProcessInfo do begin WaitForInputIdle(hProcess, INFINITE); WaitforSingleObject(ProcessInfo.hPr ocess, INFINITE); GetExitCodeProcess(ProcessInfo.hPro cess, ExitCode); CloseHandle(hThread); CloseHandle(hProcess); end else Error := GetLastError; end; end; until FindNext(fl) <> 0; FindClose(fl); end; |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Приостановка выполнения цикла | ACE Valery | Общие вопросы C/C++ | 21 | 19.11.2011 12:40 |
приостановка выполнения процедуры | BESS | Общие вопросы Delphi | 5 | 15.09.2008 00:53 |
Оператор цикла с предусловием While. Оператор цикла с пост условием Repeat | McMilin | Помощь студентам | 7 | 11.11.2007 14:10 |
Как замерить время выполнения программы | Gracel | Общие вопросы Delphi | 5 | 12.06.2007 22:16 |
Приостановка программы | Hintman | Общие вопросы Delphi | 6 | 14.04.2007 23:38 |