Форум: "Основная";
Текущий архив: 2002.12.09;
Скачать: [xml.tar.bz2];
ВнизПоследовательный запуск программ Найти похожие ветки
← →
Cranium (2002-11-30 10:33) [0]Нужно запустить одну прогу, дождаться пока она отработает, а затем другую, как это корректно оформить...
← →
Юрий Зотов (2002-11-30 10:54) [1]В потоке:
if CreateProcess(..., PI) then
begin
CloseHandle(PI.hThread);
WaitForSingleObject(PI.hProcess, INFINITE);
CloseHandle(PI.hProcess);
if CreateProcess(..., PI) then
begin
CloseHandle(PI.hThread);
CloseHandle(PI.hProcess)
end
end;
← →
AlexT1000 (2002-11-30 11:45) [2]function WinExecAndWait32(FileName:String; Visibility : integer):integer;
var
zAppName:array[0..512] of char;
zCurDir:array[0..255] of char;
WorkDir:String;
StartupInfo:TStartupInfo;
ProcessInfo:TProcessInformation;
begin
StrPCopy(zAppName,FileName);
GetDir(0,WorkDir);
StrPCopy(zCurDir,WorkDir);
FillChar(StartupInfo,Sizeof(StartupInfo),#0);
StartupInfo.cb := Sizeof(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := Visibility;
if not CreateProcess(nil,
zAppName, { указатель командной строки }
nil, { указатель на процесс атрибутов безопасности }
nil, { указатель на поток атрибутов безопасности }
false, { флаг родительского обработчика }
CREATE_NEW_CONSOLE or { флаг создания }
NORMAL_PRIORITY_CLASS,
nil, { указатель на новую среду процесса }
nil, { указатель на имя текущей директории }
StartupInfo, { указатель на STARTUPINFO }
ProcessInfo) then Result := -1 { указатель на PROCESS_INF }
else begin
WaitforSingleObject(ProcessInfo.hProcess,INFINITE);
GetExitCodeProcess(ProcessInfo.hProcess,DWord(Result));
end;
end;
WinExecAndWait32("myprog.exe,1);
WinExecAndWait32("myprog1.exe,1);
WinExecAndWait32("myprog2.exe,1);
← →
[BAD]Angel (2002-11-30 12:31) [3]Я пробывал, но есть небольшая проблемка :-)
Дэльфи не понимает, что такое TStartupInfo
В каком модуле это найти?
← →
Юрий Зотов (2002-11-30 12:39) [4]uses
Windows, ...
> AlexT1000
В этом примере, во-первых, есть лишнее и, во-вторых, есть прямая утечка ресурсов.
← →
TTCustomDelphiMaster (2002-11-30 12:47) [5]
> [BAD]Angel © (30.11.02 12:31)
Не знаю какая у вас OS стоит, но во всех версиях windows есть возможность поиска текста в файлах.
← →
[BAD]Angel (2002-11-30 12:48) [6]Что значит прямая утечка ресурсов?
← →
AlexT1000 (2002-11-30 12:54) [7]Юрий Зотов
я ее сам откуда то скатал.
может и есть утечка . не разбирался . для моих нужд она хиляла нечего делать
Дэльфи не понимает, что такое TStartupInfo
на будущее.
запускаешь far .
заходишь в папочку delph5\source и ищешь нужную строку в файлах pas. очень много интересного можно почерпнуть
← →
Юрий Зотов (2002-11-30 12:55) [8]При каждом вызове CreateProcess система создает дубликаты хэндлов hProcess и hThread и прописывает их в своих таблицах. Поскольку в данном коде они не освобождаются (нет CloseHandle), то после выхода из WinExecAndWait32 оказываются зависшими. Это и есть утечка ресурсов.
← →
Юрий Зотов (2002-11-30 13:01) [9]> для моих нужд она хиляла нечего делать
А Вы вызовите ее в цикле много раз - получите нехватку системных ресурсов. После этого ни одно приложение уже не сможет нормально работать и спасет только перезагрузка.
Вот такой код, в частности, и приводит к тому, что начинают кричать "масдай" и "отстой". А ведь есть шоферская присказка: "Дело было не в бобине...".
← →
AlexT1000 (2002-11-30 13:16) [10]спорить не буду.
ок. так, я думаю, будет в самый раз?!
function WinExecAndWait32(FileName:String; Visibility : integer):integer;
var
zAppName:array[0..512] of char;
zCurDir:array[0..255] of char;
WorkDir:String;
StartupInfo:TStartupInfo;
ProcessInfo:TProcessInformation;
begin
StrPCopy(zAppName,FileName);
GetDir(0,WorkDir);
StrPCopy(zCurDir,WorkDir);
FillChar(StartupInfo,Sizeof(StartupInfo),#0);
StartupInfo.cb := Sizeof(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := Visibility;
if not CreateProcess(nil,
zAppName, { указатель командной строки }
nil, { указатель на процесс атрибутов безопасности }
nil, { указатель на поток атрибутов безопасности }
false, { флаг родительского обработчика }
CREATE_NEW_CONSOLE or { флаг создания }
NORMAL_PRIORITY_CLASS,
nil, { указатель на новую среду процесса }
nil, { указатель на имя текущей директории }
StartupInfo, { указатель на STARTUPINFO }
ProcessInfo) then Result := -1 { указатель на PROCESS_INF }
else begin
WaitforSingleObject(ProcessInfo.hProcess,INFINITE);
GetExitCodeProcess(ProcessInfo.hProcess,DWord(Result));
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
end;
end;
← →
Юрий Зотов (2002-11-30 13:21) [11]Не совсем. CloseHandle(ProcessInfo.hThread) лучше вызывать ПЕРЕД WaitforSingleObject. Зачем держать ненужный хэндл?
← →
AlexT1000 (2002-11-30 13:34) [12]Cranium >> ну ты понял расклад?!
юзай!
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.12.09;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.011 c