读书人

怎么检测线程运行且不影响其他组件使用

发布时间: 2012-03-14 12:01:13 作者: rapoo

如何检测线程运行且不影响其他组件使用?
已实现用线程控制进度条,希望在线程事件完成后,关闭程序。
在form1的oncreate事件中,写有一下代码

Delphi(Pascal) code
 if WaitForSingleObject(hProcess, INFINITE) = WAIT_OBJECT_0 then    application.Terminate;

监控线程是否完成,并在完成后关闭程序,
但是造成线程工作期间窗体上其他组件不能使用!(按钮都点不上)
应该在哪检测线程????
求助~~~


[解决办法]
方法么,就是线程执行完通知主窗体,可以是向窗体发送消息,也可以是回调函数,使窗体关闭

下面这句如果在主线程中调用,界面会卡死的
if WaitForSingleObject(hProcess, INFINITE) = WAIT_OBJECT_0 then
application.Terminate;
[解决办法]
搞个简单点的办法

线程结束前Synchronize调用个函数,这个函数里向Form里的一个不可见的有onChange事件的组件(比如TEdit)修改值(比如Edit1.Text := '完事了';)

Edit1的onChange代码做相应的关闭动作。
[解决办法]
代码说话
Delphi(Pascal) code
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.
[解决办法]
嗯,楼上不错
[解决办法]
因为你一直在等待线程是否执行完成,所以使整个程序出现假死现象,可以写个循环把等待的时间改为100ms,如果返回WAIT_OBJECT_0才终止程序,否则响应其它消息,如下:
Delphi(Pascal) code
  while True do  begin    if WaitForSingleObject(hProcess, 100) = WAIT_OBJECT_0 then    begin      application.Terminate;      Break;    end    else      application.ProcessMessages;  end; 

读书人网 >.NET

热点推荐