如何检测线程运行且不影响其他组件使用?
已实现用线程控制进度条,希望在线程事件完成后,关闭程序。
在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;