Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.041 c
3-27865
Шурик Ш
2002-11-21 11:51
2002.12.09
Координаты ячейки DBGrid


1-27979
KoluChi
2002-11-25 13:42
2002.12.09
Преобразование HTML в текст


8-28147
FATman
2002-08-25 23:06
2002.12.09
Скины для программы


14-28219
Step[B.M.]
2002-11-16 18:02
2002.12.09
Среднестатистический возраст посетителей форума !


14-28210
Agent Smith
2002-11-16 19:20
2002.12.09
картинки для рабочего стола





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский