已实现用线程控制进度条,希望在线程事件完成后,关闭程序。
在form1的oncreate事件中,写有一下代码
 if WaitForSingleObject(hProcess, INFINITE) = WAIT_OBJECT_0 then
    application.Terminate;
监控线程是否完成,并在完成后关闭程序,
但是造成线程工作期间窗体上其他组件不能使用!(按钮都点不上)
应该在哪检测线程????
求助~~~

解决方案 »

  1.   

    方法么,就是线程执行完通知主窗体,可以是向窗体发送消息,也可以是回调函数,使窗体关闭下面这句如果在主线程中调用,界面会卡死的
     if WaitForSingleObject(hProcess, INFINITE) = WAIT_OBJECT_0 then
        application.Terminate;
      

  2.   

    搞个简单点的办法线程结束前Synchronize调用个函数,这个函数里向Form里的一个不可见的有onChange事件的组件(比如TEdit)修改值(比如Edit1.Text := '完事了';)Edit1的onChange代码做相应的关闭动作。
      

  3.   

    代码说话
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;
    type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
      private
        procedure OnThreadTerminated(Sender: TObject);
      public
        { Public declarations }
      end;  TSleepThread = class(TThread)
      private
      protected
        procedure Execute; override;
      public  end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    var
      t: TSleepThread;
    begin
      t := TSleepThread.Create(True);
      t.OnTerminate := OnThreadTerminated;
      t.Resume;
    end;{ TSleepThread }procedure TSleepThread.Execute;
    begin
      Sleep(5000);
    end;procedure TForm1.OnThreadTerminated(Sender: TObject);
    begin
      Application.Terminate;
    end;end.
      

  4.   

    因为你一直在等待线程是否执行完成,所以使整个程序出现假死现象,可以写个循环把等待的时间改为100ms,如果返回WAIT_OBJECT_0才终止程序,否则响应其它消息,如下:  while True do
      begin
        if WaitForSingleObject(hProcess, 100) = WAIT_OBJECT_0 then
        begin
          application.Terminate;
          Break;
        end
        else
          application.ProcessMessages;
      end;