我想知道是否有更好的方法来暂停线程,当不需要它时?
我们有一个Delphi类,这个类基本上是与线程处理相关联的FIFO队列。该队列在主线程上接受数据对象,如果线程被挂��,它将恢复它。
作为线程执行过程的一部分,对象从队列中弹出并在线程上进行处理。通常这是为了进行数据库查找。
在处理结束时,对象的属性会被更新并标记为可用于主线程或传递到另一个队列。Execute过程的最后一步(实际上是第一步)是检查队列中是否还有其他项。如果有,则继续,否则它会自我挂起。
关键在于只有在完成Execute循环时才会进行唯一的挂起操作,并且在正常操作期间唯一的恢复操作是在将新项放入队列时调用。例外情况是队列类正在被终止时。
恢复功能看起来像这样。
process TthrdQueue.MyResume();
begin
if Suspended then begin
Sleep(1); //Allow thread to suspend if it is in the process of suspending
Resume();
end;
end;
执行看起来类似于这样。
process TthrdQueue.Execute();
var
Obj : TMyObject;
begin
inherited;
FreeOnTerminate := true;
while not terminated do begin
if not Queue.Empty then begin
Obj := Pop();
MyProcess(Obj); //Do work
Obj.Ready := true;
end
else
Suspend(); // No more Work
end; //Queue clean up in Destructor
end;
TthrdQueue的Push例程在将另一个对象添加到堆栈后调用MyResume。仅当线程被挂起时,MyResume才会调用Resume。
关闭时,我们设置terminate为true,并在其被挂起时调用MyResume。