Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.09;
Скачать: CL | DM;

Вниз

Последовательный запуск программ   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.013 c
14-28243
evgeg
2002-11-16 17:57
2002.12.09
Как избавились от Windows


4-28364
Алексей Ким
2002-10-28 17:40
2002.12.09
ws_ex_appwindow


3-27856
Matr
2002-11-20 07:46
2002.12.09
Не все сохраняет после транзакции


4-28373
Deema Po
2002-10-25 20:20
2002.12.09
Почти TOPMOST


3-27832
UniDeMoN
2002-11-17 04:33
2002.12.09
создание собственной базы данных