Attendre fin de processus en delphi
stk
-
h4mz4 -
h4mz4 -
Bonjour !
est-ce que quelqun sait s'il existe un equivalent en delphi à :
WaitForSingleObject(ProcessInformation.hProcess, INFINITE)
en effet ça ne fonctionne apparement pas sous win98
sous NT par contre ça marche, ça permet d'attendre que le processus lancé juste avant soit terminé.
voici une partie de mon code :
var
StartInfo : TStartupInfo;
ProcessInformation : TProcessInformation;
begin
if (FindExec('presentation.pps')='') then begin
lstat.Caption := 'Installation de la visionneuse...';
ZeroMemory(@StartInfo, sizeof(StartInfo)); // remplie de 0 StartInfo
StartInfo.cb:=sizeof(StartInfo);
if CreateProcess(nil,'PPView97.exe',nil,nil,true,0,nil,nil,StartInfo,ProcessInformation) then
WaitForSingleObject(ProcessInformation.hProcess, INFINITE)// attend que l'application désignée par le handle ProcessInformation.hProcess soit terminée else
form1.close ;
lstat.Caption := 'Lancement de la présentation...';
ShellExecute(0,'OPEN','presentation.pps', Nil, Nil, SW_SHOW);
Form1.close
end else begin
lstat.Caption := 'Lancement de la présentation...';
ShellExecute(0,'OPEN','presentation.pps', Nil, Nil, SW_SHOW);
Form1.close
end;
end;
Merci par avance.
est-ce que quelqun sait s'il existe un equivalent en delphi à :
WaitForSingleObject(ProcessInformation.hProcess, INFINITE)
en effet ça ne fonctionne apparement pas sous win98
sous NT par contre ça marche, ça permet d'attendre que le processus lancé juste avant soit terminé.
voici une partie de mon code :
var
StartInfo : TStartupInfo;
ProcessInformation : TProcessInformation;
begin
if (FindExec('presentation.pps')='') then begin
lstat.Caption := 'Installation de la visionneuse...';
ZeroMemory(@StartInfo, sizeof(StartInfo)); // remplie de 0 StartInfo
StartInfo.cb:=sizeof(StartInfo);
if CreateProcess(nil,'PPView97.exe',nil,nil,true,0,nil,nil,StartInfo,ProcessInformation) then
WaitForSingleObject(ProcessInformation.hProcess, INFINITE)// attend que l'application désignée par le handle ProcessInformation.hProcess soit terminée else
form1.close ;
lstat.Caption := 'Lancement de la présentation...';
ShellExecute(0,'OPEN','presentation.pps', Nil, Nil, SW_SHOW);
Form1.close
end else begin
lstat.Caption := 'Lancement de la présentation...';
ShellExecute(0,'OPEN','presentation.pps', Nil, Nil, SW_SHOW);
Form1.close
end;
end;
Merci par avance.
A voir également:
- Attendre fin de processus en delphi
- Delphi 7 - Télécharger - Langages
- Fin des zfe - Guide
- Fin de la 4g en france - Accueil - Guide opérateurs et forfaits
- Fin du partage de compte disney + - Accueil - Streaming
- Reconsidérer le traitement de vos informations à des fins publicitaires - Accueil - Réseaux sociaux
2 réponses
Salut,
>est-ce que quelqun sait s'il existe un equivalent en delphi à :
>WaitForSingleObject(ProcessInformation.hProcess, INFINITE)
ben non car cela ne dépend pas de l'outil de dev, mais de l'API Windows.
Par contre sous W98 à quel moment cela ne fonctionne pas ?
Lors de la compil ou à l'éxecution ?
Je ne comprend pas bien non plus l'utilisation de ShellExecute, tu ne peut pas passer le nom de ta présentation en paramètre de ligne de cde lors de la création du process ex:
CreateProcess(nil,'PPView97.exe presentation.pps',nil,nil,true,0,nil,nil,StartInfo,ProcessInformation) ?
Car le WaitForSingleObject ne retourne comme son nom l'indique ;-) que lorsque le process passe à l'état signalé. Ce qui fait si j'en crois ton code que les instructions ShellExecute ne seront traitées que lorsque tu auras fermé la visionneuse => PB
Sinon je vois pas le Pb, mais ça fait un bout de temps que je n'ai pas bossé sous
Windows ...
Bon courage
Ni l'ignorance n'est défaut d'esprit,
ni le savoir n'est preuve de génie. LUC DE CLAPIERS
>est-ce que quelqun sait s'il existe un equivalent en delphi à :
>WaitForSingleObject(ProcessInformation.hProcess, INFINITE)
ben non car cela ne dépend pas de l'outil de dev, mais de l'API Windows.
Par contre sous W98 à quel moment cela ne fonctionne pas ?
Lors de la compil ou à l'éxecution ?
Je ne comprend pas bien non plus l'utilisation de ShellExecute, tu ne peut pas passer le nom de ta présentation en paramètre de ligne de cde lors de la création du process ex:
CreateProcess(nil,'PPView97.exe presentation.pps',nil,nil,true,0,nil,nil,StartInfo,ProcessInformation) ?
Car le WaitForSingleObject ne retourne comme son nom l'indique ;-) que lorsque le process passe à l'état signalé. Ce qui fait si j'en crois ton code que les instructions ShellExecute ne seront traitées que lorsque tu auras fermé la visionneuse => PB
Sinon je vois pas le Pb, mais ça fait un bout de temps que je n'ai pas bossé sous
Windows ...
Bon courage
Ni l'ignorance n'est défaut d'esprit,
ni le savoir n'est preuve de génie. LUC DE CLAPIERS
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Memo1: TMemo;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var Si :STARTUPINFO;
Pi : PROCESS_INFORMATION ;
begin
zeromemory(@si,sizeof(STARTUPINFO));
Si.dwFlags:=STARTF_USESHOWWINDOW;
Si.wShowWindow:=SW_SHOWNORMAL;
CreateProcess(nil,pchar('cmd.exe /c del c:\out.txt'),nil,nil,True,
0,nil,nil,Si,Pi);
WaitForSingleObject(pi.hProcess,INFINITE);
CreateProcess(nil,pchar('cmd.exe /c '+edit1.text+'>>c:\out.txt'),nil,nil,True,
0,nil,nil,Si,Pi);
WaitForSingleObject(pi.hProcess,INFINITE);
Memo1.Lines.Add('Le handle du process est : '+intToStr(Pi.hProcess) ) ;
Memo1.Lines.Add('L''ID du process est : '+intToStr(Pi.dwProcessId) ) ;
WaitForSingleObject(pi.hProcess,INFINITE);
memo1.Lines.LoadFromFile('c:\out.txt');
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if key=#13 then
begin
memo1.Lines.Clear;
button1.Click;
edit1.Text:='';
edit1.SetFocus;
end;
end;
end.
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Memo1: TMemo;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var Si :STARTUPINFO;
Pi : PROCESS_INFORMATION ;
begin
zeromemory(@si,sizeof(STARTUPINFO));
Si.dwFlags:=STARTF_USESHOWWINDOW;
Si.wShowWindow:=SW_SHOWNORMAL;
CreateProcess(nil,pchar('cmd.exe /c del c:\out.txt'),nil,nil,True,
0,nil,nil,Si,Pi);
WaitForSingleObject(pi.hProcess,INFINITE);
CreateProcess(nil,pchar('cmd.exe /c '+edit1.text+'>>c:\out.txt'),nil,nil,True,
0,nil,nil,Si,Pi);
WaitForSingleObject(pi.hProcess,INFINITE);
Memo1.Lines.Add('Le handle du process est : '+intToStr(Pi.hProcess) ) ;
Memo1.Lines.Add('L''ID du process est : '+intToStr(Pi.dwProcessId) ) ;
WaitForSingleObject(pi.hProcess,INFINITE);
memo1.Lines.LoadFromFile('c:\out.txt');
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if key=#13 then
begin
memo1.Lines.Clear;
button1.Click;
edit1.Text:='';
edit1.SetFocus;
end;
end;
end.
Par contre ça marche sous NT/2K et XP