Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.04.2008, 10:11   #1
Uomo
Пользователь
 
Регистрация: 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;

Не подскажите как можно осуществить возможность, чтобы вызываемый архиватор выполнял разархивирование, а уже затем продолжалось выполение цикла. А то получается если в директории находится несколько файлов архиватор не успевает их обработать.
Uomo вне форума Ответить с цитированием
Старый 04.04.2008, 10:28   #2
Ins
Форумчанин
 
Регистрация: 29.12.2007
Сообщений: 137
По умолчанию

Вместо ShellExecute - CreateProcess и дождаться окончания вызовом WaitForSingleObject.

ЗЫ: Утечка ресурсов - ты FindClose забыл
Ins вне форума Ответить с цитированием
Старый 04.04.2008, 10:40   #3
Uomo
Пользователь
 
Регистрация: 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; снова используется
Uomo вне форума Ответить с цитированием
Старый 04.04.2008, 11:48   #4
Uomo
Пользователь
 
Регистрация: 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;
Uomo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Приостановка выполнения цикла 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