お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
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