Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.06.04;
Скачать: [xml.tar.bz2];

Вниз

ShellExecuteEx и WaitForSingleObject   Найти похожие ветки 

 
Близнец   (2006-05-19 09:21) [0]

Доброго времени суток!
Необходимо вывести сообщение только после завершения архивации. Использую код:

FillChar(ShellExecuteInfo, SizeOf(TShellExecuteInfo), 0);
with ShellExecuteInfo do
  begin
  cbSize := Sizeof(TShellExecuteInfo);
  Wnd := Handle;
  lpFile := PChar("winrar.exe");
  lpParameters:=PChar("a -agYYYYMMDD -ep1 -t -r "+"""+filename+"" +"""+dir_path+"\*.*" ");
  lpDirectory:=PChar(rar_path);
  lpVerb := "open";
  nShow := SW_SHOWNORMAL;
  end;
try
 if ShellExecuteEx(@ShellExecuteInfo) then
    begin
    while WaitforSingleObject(ShellExecuteInfo.hProcess,200)=WAIT_TIMEOUT   do
    Repaint;
    showmessage ("Архивирование "+dir_path+" закончено!")
    end
 else showmessage ("Архивирование "+dir_path+" завершилось неудачей!")
finally
 CloseHandle(ShellExecuteInfo.hProcess);
end;


Сообщение появляется сразу, как архивация начинается, а не после. Подскажите, что не так, плз.


 
balepa ©   (2006-05-19 09:50) [1]

while WaitforSingleObject(ShellExecuteInfo.hProcess,200)=WAIT_TIMEOUT   do
   Repaint;
   showmessage ("Архивирование "+dir_path+" закончено!")
end
Ну вопервых while нафик не нужен
Во-вторых ты поставил скажем так время ожидания 200 мс а за 200 мс ты заархивировать не успееш

DWORD WINAPI WaitForSingleObject(
 HANDLE hHandle,
 DWORD dwMilliseconds
);

Parameters
hHandle
[in] Handle to the object. For a list of the object types whose handles can be specified, see the following Remarks section.
If this handle is closed while the wait is still pending, the function"s behavior is undefined.

The handle must have the SYNCHRONIZE access right. For more information, see Standard Access Rights.

dwMilliseconds
[in] Time-out interval, in milliseconds. The function returns if the interval elapses, even if the object"s state is nonsignaled. If dwMilliseconds is zero, the function tests the object"s state and returns immediately. If dwMilliseconds is INFINITE, the function"s time-out interval never elapses.


 
Игорь Шевченко ©   (2006-05-19 09:56) [2]


> while WaitforSingleObject(ShellExecuteInfo.hProcess,200)=WAIT_TIMEOUT
>   do
>    Repaint;
>    showmessage ("Архивирование "+dir_path+" закончено!")
> end


Не пиши так больше никогда


 
Близнец   (2006-05-19 10:29) [3]

200 мс заменен на INFINITE, все по-прежнему...


 
balepa ©   (2006-05-19 10:36) [4]


> Близнец   (19.05.06 10:29) [3]
> 200 мс заменен на INFINITE, все по-прежнему...


While убрал ?


 
Близнец   (2006-05-19 10:47) [5]

да


 
balepa ©   (2006-05-19 10:50) [6]

Покажи как теперь


 
Близнец   (2006-05-19 13:08) [7]

if ShellExecuteEx(@ShellExecuteInfo) then
   begin
   WaitforSingleObject(ShellExecuteInfo.hProcess,INFINITE);
   showmessage ("Архивирование "+dir_path+" закончено!")
   end
      else showmessage ("Архивирование "+dir_path+" завершилось неудачей!")


 
Близнец   (2006-05-19 13:13) [8]

if ShellExecuteEx(@ShellExecuteInfo) then
   begin
   WaitforSingleObject(ShellExecuteInfo.hProcess,INFINITE);
   showmessage ("Архивирование "+dir_path+" закончено!")
   end
      else showmessage ("Архивирование "+dir_path+" завершилось неудачей!")


 
Сергей М. ©   (2006-05-19 13:31) [9]

if ShellExecuteEx(@ShellExecuteInfo) then
  case MsgWaitForMultipleObjects(1, @ShellExecuteInfo.hProcess, False, INFINITE, QS_ALLINPUT) of
  WAIT_OBJECT_0:
    showmessage ("Архивирование "+dir_path+" закончено!");
  WAIT_OBJECT_0 + 1:
    Application.ProcessMessages;    
  end
else
  showmessage ("Архивирование "+dir_path+" не то чтобы не завершилось - оно вообще не начато !")


 
Близнец   (2006-05-19 14:12) [10]

2 Сергей М.
если я пишу так:
if ShellExecuteEx(@ShellExecuteInfo) then
   if WaitforSingleObject(ShellExecuteInfo.hProcess,INFINITE)=WAIT_OBJECT_0 then
  showmessage ("Архивирование "+dir_path+" закончено!")
        else showmessage ("Архивирование "+dir_path+" завершилось неудачей!")

то, я так понимаю, для меня разницы с твоим вариантом никакой нет
результат - архивирование идет, сообщения вообще никакого не выдается


 
Игорь Шевченко ©   (2006-05-19 14:44) [11]

procedure TfMain.DumpFile(const FileName: string);
var
 ShellInfo: TShellExecuteInfo;
 ParamsString: string;
begin
 ParamsString := Format("-em %s %s.aaa", [FileName, FileName]);
 ShellInfo.cbSize := SizeOf(ShellInfo);
 ShellInfo.fMask := SEE_MASK_NOCLOSEPROCESS;
 ShellInfo.Wnd := Handle;
 ShellInfo.lpVerb := "open";
 ShellInfo.lpFile := "tdump";
 ShellInfo.lpParameters := PChar(ParamsString);
 ShellInfo.lpDirectory := nil;
 ShellInfo.nShow := SW_SHOW;
 if not ShellExecuteEx(@ShellInfo) then
   RaiseLastWin32Error;
 if ShellInfo.hProcess <> 0 then
   try
     WaitForSingleObjectEx(ShellInfo.hProcess, INFINITE, false);
   finally
     CloseHandle(ShellInfo.hProcess);
   end;
end;



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.06.04;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.043 c
15-1147029232
SergProger
2006-05-07 23:13
2006.06.04
Настройка подключения


3-1144138909
Бульбаш
2006-04-04 12:21
2006.06.04
Позиция курсора в гриде


2-1147951248
Creative
2006-05-18 15:20
2006.06.04
wm_char


15-1147247197
WhiteBarin
2006-05-10 11:46
2006.06.04
Компонент Бегущая строка


1-1146136334
tytus
2006-04-27 15:12
2006.06.04
ListBox и фоновый рисунок





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