|
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"起動したEXEの終了待ち"
プログラムAから他のプログラムBを起動して、プログラムBの終了まで
プログラムAを止めたいとき次のように書くことができます。
var
h: THandle;
begin
h:= CreateProcess(...プログラムB.EXE...);
while WaitForSingleObject(h, 0) do Application.ProcessMessages; // *
CloseHandle(h);
end;
これだとプログラムBの終了を待っている間もプログラムAが稼動しっぱなし
でCPUパワーの無駄です。そこで*の部分を
WaitForSingleObject(h, INFINITE);
としてみるのですが、なんとWORD98が起動しなくなることがあるみたいです
(なぜ?)
もっとうまい方法があるのかもしれませんが、次の方法を提案します。
type
TExecWaitThread = class(TThread)
WinHandle, ModHandle: THandle;
protected
procedure Execute; override;
public
ModQuit: boolean;
constructor Create(AWinHandle, AModHandle: THandle);
end;
constructor TExecWaitThread.Create(AWinHandle, AModHandle: THandle);
begin
WinHandle:= AWinHandle;
ModHandle:= AModHandle;
Priority:= tpLowest; // てきとう
ModQuit:= False;
inherited Create(False);
end;
procedure TExecWaitThread.Execute;
begin
WaitForSingleObject(ModHandle, INFINITE);
ModQuit:= True;
PostMessage(WinHandle, WM_USER+1000, 0, 0); // てきとうなMSG
end;
procedure ExecWait(WinH, ModH: THandle);
var
EW: TExecWaitThread;
begin
EW:= TExecWaitThread.Create(WinH, ModH);
while not EW.ModQuit do Application.HandleMessage;
EW.Free;
end;
:
procedure TForm1.B...
var
h: THandle;
begin
h:= CreateProcess(...プログラムB.EXE...);
ExecWait(Handle, h);
CloseHandle(h);
end;
まるぼろ
Original document by まるぼろ 氏 ID:(JBE02127)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|