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

Вниз

Задержка в программе   Найти похожие ветки 

 
Андрей Н.   (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 вся ветка

Текущий архив: 2004.12.26;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.024 c
14-1102330070
AlexG
2004-12-06 13:47
2004.12.26
Оценим сайт? Интересно просто ваше мнение...


1-1103086828
Андерсон
2004-12-15 08:00
2004.12.26
Экспорт в Excel буленовское поле


14-1101808213
Sur
2004-11-30 12:50
2004.12.26
PL/1 - Programming Language One


1-1102817066
Hoot
2004-12-12 05:04
2004.12.26
У меня в компоненте есть FItems : TStrings; Как мне перехватить


4-1099737740
acsoft
2004-11-06 13:42
2004.12.26
Открывать txt моей программой