做了个线程池
希望由线程自行到线程池那里领取任务
于是在TThreadPool类中写了一个GetTask方法
线程调用这个方法获得任务function TThreadPool.GetTask(TID: integer): boolean;
var
  P: Pointer;
begin
  P := FTasks.Pop(); //FTasks: TQueue; 是任务队列
  FThreads[TID].SetTask(P); 
  Result := (P <> nil);
end;其中SetTask是线程对象的方法
用于把对领取到的任务进行预处理
GetTask的返回值如果为false则触发timeout
一定时间后Free空闲的线程现在的问题是,实际调试的时候,线程领取不到任务.添加断点调试发现,GetTask中的代码不会完全执行,一般只执行第一句.考虑到可能是同步的问题,就用了Synchronize,问题依旧.求问题原因及解决方法...

解决方案 »

  1.   

    使用用临界区或者互斥对象保护 FTasks.pop操作另外,之所以有 线程池 的概念就是为了避免频繁的create free线程。
      

  2.   

    好的
    我先去试试
    这个线程池只有在一定时间内没有新任务才会Free线程的
    之前找到的一个所谓线程池的代码就是不断的重新创建线程
    所以才自己做一个
      

  3.   

    试了下临界区
    代码依然只执行第一句
    然后就跳到别的地方去了
    Thread类的Excute中的代码也不会执行完
    只要执行到调用(直接或间接)GetTask的地方线程就不往下执行了
    Excute里是一个while true循环
    只有没有得到任务才会Suspend
    但是现在看起来是执行了那一句代码以后整个线程就结束了...