晚辈的问题就是,程序正在运行中,已经放出10几个线程,在这些线程未全部运行完毕并返回之前,时可能需要关闭程序,这个时候应该怎么做?我的做法是这样: ThreadsPool.OnProcessRequest := DoMyWork;......
procedure TForm1.DoMyWork(Sender : TThreadsPool; WorkItem : TWorkItem;
    aThread : TProcessorThread);
begin
    if IsUserClose then
         aThread.Terminate ;    ......end;
但是怎么才能知道所有的线程已经全部Terminated,也就是什么时候才可以关闭程序。发消息给作者也不回复消息,所以只能靠使用过的前辈的指点了。要是这个uThreadPool 不好用的话,能否提供一个好用的uThreadPool和相关例子,谢谢。

解决方案 »

  1.   

    看看下面的:   
      -------------------------   
    (I)线程的中止   
        看了几本书,提到线程的中止主要有三种途径:
        1 线程所属进程中止;
        2 线程内部调用EndThread函数;
        3 线程外部调用TerminateThread函数。   
          
      1.   线程所属进程中止这一条似乎可行,事实上每次应用程序关闭之前都还要检查是否还有未结束的线程,如果还有线程没结束比如正在进行数据库等操作,则关闭应用程序可能会出问题      
              
      2.EndThread函数   当线程函数Excute()执行完毕,它会调用Delphi的标准例程EndThread,这个例程再调用API函数ExitThread()。由ExitThread()来清除线程所占用的栈。按照这种说法,我们在线程函数中直接调用EndThread(0)应该可以直接结束线程执行,并且释放了线程所占用的资源?(问题三:是这样的吧,我还没来得及试)这样就可以结合线程的Terminated属性,有如下代码了:   
      
      在线程函数中频繁检查Terminated属性   
      if (self.Terminated   or   Application.Terminated)   EndThread(0)   
              
    3. TerminateThread函数是Win32API函数,其声明如下:
      function  TerminateThread(hThread: THandle; dwExitCode: DWORD);     
    TThread的Handle属性可以作为第一个参数,因此,TerminateThread()常这样调用:   
      TerminateThread(MyhoseedThread.handle,0)如果选择使用这个函数,应该考虑到它的负面影响。无论线程代码中是否有try.   .   .   finally块,这个函数都会使线程立即停止执行。这意味着,被线程打开的文件没有被关闭、由线程申请的内存没有被释放等情况。而且,这个函数在终止线程的时候也不通知DLL,当DLL关闭时,这也容易出现问题.
              
    4.关于waitfor方法   等待线程结束可以调用它的WaitFor方法。不过有些不解之处。比如Delphi5开发人员指南中有这样一段代码:   
      for   i:=ThreadList.count-1   downto   0   do   begin   
          TDrawThread(ThreadList[i]).Terminate;   
          TDrawThread(ThreadList[i]).waitfor;   
           end;   
        
          综上,如果结束一个线程比较稳妥的方式是这样:首先,在线程函数中频繁检查Terminated属性,发现为True时,调用EndThread(0)方法结束线程;在需要的时候调用线程的Terminate方法将线程的Terminated属性设置为true即可达到结束线程的问题;为了确保线程已经终止,使用waitfor方法进行确认。   
      
      

  2.   

    本人菜鸟,不懂得如何修改uThreadPool,所以,还请各位前辈指点
      

  3.   

    没用过uThreadPool。但如果是TThread,则有OnTerminate事件
      

  4.   

    人民币购买 uThreadPool 的使用方法,这年头,只认钱,越来越和谐了。
      

  5.   

    如果使用   TThread   类,不可能立即中止线程。使用   Terminate   方法只是设置线程类里面的一个   Terminated   标志。要想快点结束线程,要在   Execute   函数里面多加对   Terminated   标志的判断。如果非要立即结束线程,就不能使用   TThread   类,改成使用   windows   的   api   直接操作线程,使用   CreateThread,   ExitThread.