当前位置:主页>仓库管理软件> 列表

如何判断线程已执行完毕? 找用友财务管理软件

库存管理软件版1楼: MyThread:=TMyThread.Create(False);
如何判断线程MyThread已执行完毕?
因为程序中有个事件必须等某线程完成后才执行
说明中说可以用ReturnValue,但我感觉这个值一直是0,没有变化啊

2楼: 用MyThread.Waitfor或者WaitForSingleObject(MyThread.Handle, INFINITE) 如免费好用的进销存

3楼: 把你要執行的事件放到線程的Excute中
MyThread.Execute
....
FreeOnTerminate:=True;
Onterminate:=你要執行的事件;
....

4楼: tseug,兄弟,可以讲清楚一点吗?

5楼: [code]
type
TMyThread = class(TThread)
protected
procedure Execute; override;
end;
{ TMyThread }

procedure TMyThread.Execute;
begin
FreeOnTerminate := False;

Sleep(5000);
end;



procedure TForm3.Button1Click(Sender: TObject);
var
T : TMyThread;
begin
T := TMyThread.Create(False);
try
T.WaitFor;
ShowMessage(''执行完了'');
finally
T.Free;
end;
end;

procedure TForm3.Button2Click(Sender: TObject);
var
T : TMyThread;
begin
T := TMyThread.Create(False);
try
if WaitForSingleObject(T.Handle, INFINITE) = WAIT_OBJECT_0 then
begin
ShowMessage(''执行完了'');
end;
finally
T.Free;
end;
end;

[/code]

6楼: 流浪者_2008的方法是正确的

库存管理软件版7楼: tseug的方法是可以的,但是有一个缺点,当执行线程的时候主程序也会停下来等待线程的结束,主程序会暂停响应,这样调用多线程就没有意义了。

8楼: 对,流浪者是正确的,使用事件来控制,在多线程版有回答的了,就是几个线程如何控制一个执行完了,然后去执行另外一个,

9楼: 用Onterminate事件当然可以,但是这时线程并没有结束,仅仅表示Execute方法调用
结束了,而用WaitforSingleObject就不同了

10楼: 使用Onterminate事件固然有它的局限性,因为触发Onterminate事件的时候线程还没有完全结束,用它的优点是线程执行的同时,主程序也可以继续执行,这也是多线程的优点之一。
要实现线程完全结束才触发主程序继续执行的话,主线程中执行WaitFor是比较好的实现方法,然而主线程调用WaitFor必须用MsgWaitForMultipleObjects来等待线程,而不是WaitforSingleObject。因为在线程函数Execute中可能调用Synchronize处理同步方法,而同步方法是在主线程中执行的,如果用WaitForSingleObject等待的话,则主线程在这里被挂起,同步方法无法执行,导致线程也被挂起,于是发生死锁。


如果必须要用WaitForSingleObject,应该另开线程来调用WaitForSingleObject,而不是在主线程。
以上是在下愚见,见笑了!哈!

11楼: 不必讨论了,让他把源代码帖出来或许根本就没必要讨论。因为他的实现代码或许根本就
是错误的或者根本就和讨论的是二回事。

12楼: 呃。。小雨哥今晚火气好像有点大。。善哉善哉。。[:)] 如用友财务管理软件

13楼: 这样可以使得界面不"死",但是由于ProcessMessages的缘故,不能保证某段代码不被执行,除非设置一个标志..

procedure TForm1.Button3Click(Sender: TObject);
var
T: TMyThread;
H: THandle;
W: DWord;
begin
T := TMyThread.Create(False);
H := T.Handle;

repeat
W := MsgWaitForMultipleObjects(1, H, False, INFINITE, QS_ALLINPUT);
Application.ProcessMessages;
until (W = WAIT_OBJECT_0) or (W = WAIT_FAILED);

ShowMessage(''执行完了'');

T.Free;
end;

库存管理软件版14楼: 但是这样一来的话, 还不如在线程建立的时候设置标志True, 线程结束的时候设置标志False, 并且在"必须等某线程完成后才执行"的那个过程中判断此标志, 或者直接用GetExitCodeThread()来判断线程状态.. 呃, 以上答案仅供参考, [:)]

15楼: To 刘麻子:不是的,不是火气大,其实楼上的诸位说得都很有道理,问题是大家的讨论


并不一定能帮上他的忙,因他都不能很好地描述是否考虑了某种同步机制,大家的回答就
显得瞎帮忙了,而不同的同步机制,会伴随着产生很多其他的问题(见: http://delphibbs.com/delphibbs/dispq.asp?lid=2964150 ),
隔靴搔痒越搔越痒,所以我觉得还不如让他把代码帖出来更直截了当。

16楼: ok, 小雨哥所言极是, 呼唤楼主.. [:D]
时间不早了, 俺要睡觉了, 被催了N次, 大家也早点歇息吧, 早睡早起身体好, :~)

17楼: GetExitCodeThread()应该如何运用??

18楼: //等待一个线程结束的关键代码。绝对可行
var
i:dword;
isquit:boolean;
begin
if assigned(AThread) then
begin
isquit:=GetExitCodeThread(AThread.handle,i);
if isquit then
begin
if i=STILL_ACTIVE then
begin
WaitForSingleObject(AThread.Handle,INFINITE
);
end
end;
end;
end;

19楼: 楼主失踪了? 看来小雨哥说的是对的。。 [:(][:(]

20楼: 多人接受答案了。