Thread - monitorando aplicativo com thread

Top  Previous  Next

Question/Problem/Abstract:

--------------------------

I need to run another application and then monitor it, waiting for it to close. 

My program needs to do other things while this is happening to it'd be helpful 

if this was multithreaded. 

 

Answer:

-------

type 

  TForm1 = class(TForm) 

    Button1: TButton; 

    procedure Button1Click(Sender: TObject); 

  private 

  public 

  end; 

 

var 

  Form1: TForm1; 

 

implementation 

 

{$R *.DFM} 

 

const unitName = 'runThread_.'; 

 

type TRunThread = class(TThread) 

  private 

    processHandle : cardinal; 

    processReady  : boolean; 

    waitingThread : cardinal; 

    procedure Execute; override; 

  end; 

 

procedure TRunThread.Execute; 

begin 

  WaitForSingleObject(processHandle,INFINITE); 

  processReady:=true; 

  PostThreadMessage(waitingThread,WM_NULL,0,0); 

end; 

 

procedure TForm1.Button1Click(Sender: TObject); 

var si  : TStartupInfo; 

    pi  : TProcessInformation; 

    dw1 : dword; 

begin 

  enabled:=false; 

  caption:='start copy...'; 

  ZeroMemory(@si,sizeOf(si)); si.cb:=sizeOf(si); 

  si.dwFlags:=STARTF_USESHOWWINDOW; si.wShowWindow:=SW_NORMAL; 

  if CreateProcess(nil,'c:\windows\notepad.exe', nil, nil, false, 0, 

                   nil, nil, si, pi) then 

    begin 

    caption:='copy started...'; 

    with TRunThread.Create(true) do 

      try 

        processHandle:=pi.hProcess; 

        processReady:=false; 

        waitingThread:=GetCurrentThreadID; 

        caption:='notepad...'; 

        Resume; 

        repeat 

          Application.HandleMessage; 

        until Application.Terminated or processReady; 

        caption:='notepad closed...'; 

      finally Free end; 

    GetExitCodeProcess(pi.hProcess,dw1); 

    CloseHandle(pi.hThread); 

    CloseHandle(pi.hProcess); 

    caption:='ready... (exitCode='+IntToStr(dw1)+')'; 

  end else caption:='could not start notepad...'; 

  enabled:=true; 

end; 

 

end.