Форум: "WinAPI";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];
ВнизЗадержка в программе Найти похожие ветки
← →
Андрей Н. (2004-11-08 11:31) [0]Программа использует Rar для упаковки файлов, выбранных пользователем.
Для запуска Rar я использую ф-цию ShellExecute. Операторы, стоящие за ShellExecute
не должны быть выполнены до тех пор, пока Rar не упакует файлы.
Поскольку заранее неизвестно время, которое может понадобиться на упаковку,
использовать для задержки ф-цию Sleep нельзя.
Подскажите, как определить, что архивация завершена?
Заранее благодарен за ответ.
← →
KilkennyCat © (2004-11-08 11:39) [1]Я бы наверное использовал библиотеку рара в данном случае... для архивации.
Ноесли необходимо именно так, то - ShellExecuteEx. Он возвращает дескриптор запущенного процесса, что в дальнейшем длолжно помочь проверить его наличие.
← →
digger © (2004-11-08 12:48) [2]Пример функции вызова архиватора
function TFrm_main.Unpack: Boolean;
var
startup_info: _STARTUPINFOA;
procces_info: _PROCESS_INFORMATION;
exitcode: Cardinal;
param: String;
k: Boolean;
begin
Result := False;
startup_info.cb := sizeof(_STARTUPINFOA);
startup_info.lpReserved := 0;
startup_info.lpDesktop := 0;
startup_info.lpTitle := 0;
startup_info.cbReserved2 := 0;
startup_info.lpReserved2 := 0;
startup_info.dwFlags := STARTF_USESHOWWINDOW;
startup_info.wShowWindow := SW_HIDE;
// в переменной param храняться параметры командной строки
k := CreateProcess(nil, PAnsiChar(param), 0, 0, False, 0, 0, 0, startup_info, procces_info);
if k = False then begin
Result := false; // ошибка запуска
exit;
end;
repeat
GetExitCodeProcess(procces_info.hProcess, exitcode);
Application.ProcessMessages;
until exitcode <> STILL_ACTIVE;
if exitcode <> 0 then exit;
Result := True;
end;
Процедура запускает процесс и ждет его окончания
← →
GuAV © (2004-11-08 12:56) [3]digger © (08.11.04 12:48) [2]
А Хэндлы кто закрывать будет ?
Лучше этот пример:
http://www.delphimaster.ru/cgi-bin/faq.pl?look=1&id=988621841&n=15
и в конце добавить про exitcode
← →
Piter © (2004-11-08 15:18) [4]KilkennyCat © (08.11.04 11:39) [1]
Я бы наверное использовал библиотеку рара в данном случае... для архивации.
а разве есть библиотека RAR для архивации? Есть только unrar.dll
Также не знаю, что там в текущем в FAQ, но в новом вот что будет:
-----------------------------------------------
Вопрос: как запустить другую программу и дождаться ее окончания.
Ответ: для запуска внешнего процесса будем использовать богатую на возможности функцию CreateProcess.
При успешном создании нового процесса эта функция заполняет передаваемую структуру PROCESS_INFORMATION, в частности поле hProcess, которое является указателем на новый процесс.
В случае надобности мы передаем полученный указатель на новый процесс в функцию WaitForSingleObject вместе со значением infinite.
В результате, WaitForSingleObject прервет выполнение потока нашей программы до тех пор, пока нужный нам процесс не завершится. В случае со значением infinite функция будет ждать бесконечно долго, поэтому вы должны быть уверены, что нужный процесс когда-нибудь завершится, иначе ваш поток никогда не получит управление обратно (в случае, если данный код исполняется для основного потока как в примере - это приведет к зависанию программы).
Пример:
unit ufCreateProcess;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//Функция для создания нового процесса
//Параметры:
// aCommand: Строка для выполнения исполняемого файла(полный путь)
// aShow: Показывать/не показывать окно нового процесса
// aWaitExit: Ожидать/не ожидать завершения процесса
function ExecCmd(const aCommand: String;const aShow, aWaitExit: Boolean): Boolean;
var
pi:PROCESS_INFORMATION;
si:STARTUPINFO;
cmdLine,Path: String;
begin
Result := False;
ZeroMemory(@si,sizeof(si));
si.cb:=SizeOf(si);
si.dwFlags := STARTF_FORCEONFEEDBACK+STARTF_USESHOWWINDOW;
if aShow then si.wShowWindow := SW_SHOWNORMAL else si.wShowWindow := SW_HIDE;
Path := ExtractFilePath(aCommand);
cmdLine := aCommand;
Result :=
CreateProcess( nil, // No module name (use command line).
PChar(cmdLine), // Command line.
nil, // Process handle not inheritable.
nil, // Thread handle not inheritable.
False, // Set handle inheritance to FALSE.
0, // No creation flags.
nil, // Use parent"s environment block.
PChar(Path), // Use parent"s starting directory.
si, // Pointer to STARTUPINFO structure.
pi ); // Pointer to PROCESS_INFORMATION structure.
if Result then
begin
CloseHandle(pi.hThread);
if aWaitExit then WaitForSingleObject( pi.hProcess, infinite );
CloseHandle(pi.hProcess);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ExecCmd(ExtractFilePath(ParamStr(0))+"pkzip test.zip",True,False);
end;
end.
Файл проекта с данным примером можно загрузить ЗДЕСЬ
Отвечали: Panov, Piter
← →
Poirot © (2004-11-09 20:08) [5]>> digger © (08.11.04 12:48) [2]
>> repeat
>> GetExitCodeProcess(procces_info.hProcess, exitcode);
>> Application.ProcessMessages;
>> until exitcode <> STILL_ACTIVE;
Это реально круто:))
← →
programania © (2004-11-09 21:28) [6]>Piter ©
К сожалению не все программы запускаются CreateProcess
Как дождаться окончания WORD, EXCEL.
Может им нужны особые параметры?
← →
GuAV © (2004-11-09 22:09) [7]Poirot © (09.11.04 20:08) [5]
Ну да вот хочется чтобы кнопочки нажимались в проге пока винрар работает... не заводить же ради такой мелочи доп. поток который ждал бы... и в таймере проверять не хочется...
← →
KilkennyCat © (2004-11-10 02:07) [8]
> Piter © (08.11.04 15:18) [4]
валялась где-то...
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.052 c