![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Последовательный запуск программ [D5]
Cranium © (2002-11-30 10:33:00)Нужно запустить одну прогу, дождаться пока она отработает, а затем другую, как это корректно оформить...
AlexT1000 (2002-11-30 13:34:00) [1]Cranium >> ну ты понял расклад?!
юзай!
Юрий Зотов (2002-11-30 13:21:00) [2]Не совсем. CloseHandle(ProcessInfo.hThread) лучше вызывать ПЕРЕД WaitforSingleObject. Зачем держать ненужный хэндл?
AlexT1000 (2002-11-30 13:16:00) [3]спорить не буду.
ок. так, я думаю, будет в самый раз?!
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:01:00) [4]> для моих нужд она хиляла нечего делать
А Вы вызовите ее в цикле много раз - получите нехватку системных ресурсов. После этого ни одно приложение уже не сможет нормально работать и спасет только перезагрузка.
Вот такой код, в частности, и приводит к тому, что начинают кричать "масдай" и "отстой". А ведь есть шоферская присказка: "Дело было не в бобине...".
Юрий Зотов (2002-11-30 12:55:00) [5]При каждом вызове CreateProcess система создает дубликаты хэндлов hProcess и hThread и прописывает их в своих таблицах. Поскольку в данном коде они не освобождаются (нет CloseHandle), то после выхода из WinExecAndWait32 оказываются зависшими. Это и есть утечка ресурсов.
AlexT1000 (2002-11-30 12:54:00) [6]Юрий Зотов
я ее сам откуда то скатал.
может и есть утечка . не разбирался . для моих нужд она хиляла нечего делать
Дэльфи не понимает, что такое TStartupInfo
на будущее.
запускаешь far .
заходишь в папочку delph5\source и ищешь нужную строку в файлах pas. очень много интересного можно почерпнуть
[BAD]Angel (2002-11-30 12:48:00) [7]Что значит прямая утечка ресурсов?
TTCustomDelphiMaster (2002-11-30 12:47:00) [8]
> [BAD]Angel © (30.11.02 12:31)
Не знаю какая у вас OS стоит, но во всех версиях windows есть возможность поиска текста в файлах.
Юрий Зотов (2002-11-30 12:39:00) [9]uses
Windows, ...
> AlexT1000
В этом примере, во-первых, есть лишнее и, во-вторых, есть прямая утечка ресурсов.
[BAD]Angel (2002-11-30 12:31:00) [10]Я пробывал, но есть небольшая проблемка :-)
Дэльфи не понимает, что такое TStartupInfo
В каком модуле это найти?
AlexT1000 (2002-11-30 11:45:00) [11]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);
Юрий Зотов (2002-11-30 10:54:00) [12]В потоке:
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;