这个问题涉及 Delphi 和 XE 专门弃用 Suspend 和 Resume。我已经阅读了其他帖子,但到目前为止我还没有找到类似的用法,所以我将继续要求讨论。
我想知道是否有更好的方法在不需要时暂停线程?
我们有一个多年来一直使用的 Delphi 类,它基本上是一个与线程进程相关联的 FIFO 队列。队列接受主线程上的数据对象,如果线程被挂起,它将恢复它。
作为线程执行过程的一部分,对象从队列中弹出并在线程上处理。通常这是进行数据库查找。
在进程结束时,对象的属性被更新并标记为可用于主线程或传递到另一个队列。Execute 过程的最后一步(实际上是第一步)是检查队列中是否还有其他项目。如果有它继续,否则它会暂停自己。
它们的关键是当它完成时唯一的挂起操作是在执行循环内,并且在正常操作期间的唯一恢复是在将新项目放入队列时调用的。例外情况是队列类被终止时。
resume 函数看起来像这样。
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。