Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.036 c
1-1102739411
Eugeni
2004-12-11 07:30
2004.12.26
TListBox


11-1084117134
a_legayda@mtu-net.ru
2004-05-09 19:38
2004.12.26
TKOLTabControl


1-1102661652
Kerk
2004-12-10 09:54
2004.12.26
Глюк кодогенератора или мой?


10-1072286014
Mozg
2003-12-24 20:13
2004.12.26
Переход с Delphi5 + Visibroker 3 на Delphi 7 + Visibroker4


1-1102528136
Руслана
2004-12-08 20:48
2004.12.26
Перестала запускаться Delphi7





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский