+ -
当前位置:首页 → 问答吧 → 如何实现主线程等待子线程执行完成后再继续往下执行,Delphi

如何实现主线程等待子线程执行完成后再继续往下执行,Delphi

时间:2011-09-20

来源:互联网

做了一个ftp下载程序:创建一条控制线程,控制线程又创建10条子线程用来下载上传。在控制线程中循环判断所有的子ftp线程是否都已经执行完成。
现在想问如何让程序等待控制线程执行完后再继续执行以后的程序?

作者: feifeia007   发布时间: 2011-09-20

写个带条件的循环不就行了

作者: cntigercat   发布时间: 2011-09-20

看一下置顶的贴子就可以了
http://topic.csdn.net/u/20110217/11/56577c65-2e77-4f8f-b541-0be47cdb4d60.html?69977

作者: babydog01   发布时间: 2011-09-20

ControlThread:=ControlThread.Create(true);
ControlThread.Resume;
while true do
begin
  if ControlThread.isEnd then
  begin
  break;
  end;
  sleep(0);
end;
showMessage('OK');
这样写的话,所有的线程都不干活了。

ControlThread:=ControlThread.Create(true);
ControlThread.Resume;
//在这做些什么能等ControlThread释放了再showMessage
showMessage('OK');

作者: feifeia007   发布时间: 2011-09-20

Delphi(Pascal) code

  //Do something;
 dwet := WaitForSingleObject(需要等待结束的线程句柄, INFINITE);//如果等待多个线程用WaitForMultipleObjects

作者: m617105   发布时间: 2011-09-20

引用 2 楼 babydog01 的回复:
看一下置顶的贴子就可以了
http://topic.csdn.net/u/20110217/11/56577c65-2e77-4f8f-b541-0be47cdb4d60.html?69977

发帖前已经看过这个帖子了,本人属菜鸟,没看懂


引用 4 楼 m617105 的回复:
Delphi(Pascal) code

//Do something;
dwet := WaitForSingleObject(需要等待结束的线程句柄, INFINITE);//如果等待多个线程用WaitForMultipleObjects

能解释下么?

作者: feifeia007   发布时间: 2011-09-20

引用 5 楼 feifeia007 的回复:
引用 2 楼 babydog01 的回复:
看一下置顶的贴子就可以了
http://topic.csdn.net/u/20110217/11/56577c65-2e77-4f8f-b541-0be47cdb4d60.html?69977

发帖前已经看过这个帖子了,本人属菜鸟,没看懂



引用 4 楼 m617105 的回复:
Delphi(Pascal) code

//……

其实你的控制线程完全可以用WaitForMultipleObject来等待所有FTP线程都执行完毕然后继续往下执行
type
  TBasicThread = class(TThread)
  protected
  procedure Execute; override;
  public
end;

var
  tContrlThread:TBasicThread;//控制线程
.......

主程序中
  WaitForSingleObject(tContrlThread.Handle, INFINITE);//主程序会一直等待直到控制线程结束

在控制线程的Execute可以这样
  WaitForMultipleObject(FTP线程数目,FTP线程句柄数组,TRUE,INFINITE);//会等到所有线程都执行完毕才会继续往下执行
不过以上方法有个弊端就是如果你的FTP线程有一个进入了死循环无法正常返回,控制线程就会一直等待下去

作者: m617105   发布时间: 2011-09-20