Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Последовательный запуск программ [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;


Наверх

Титульная страница Поиск, карта сайта Написать письмо