【发布时间】:2011-05-23 00:26:20
【问题描述】:
这个问题涉及 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。
【问题讨论】:
-
我不是专家,但我会简单地使用 Sleep(250) 或 SignalObjectAndWait(参见 msdn)来进行更精确的控制。
标签: multithreading delphi resume suspend