对于 TEvent 来说,如果是调用 WaitFor 等待超时时,如果程序退出时,事件仍在等待状态,就需要等待超时才能退出,造成程序退出时等待很长时间。要改进这一点,我们需要新版的 QWorker,它实现了一个 TAbortableEvent 的记录类型,然后支持取消操作。
TAbortableEvent 的增强在于:
- 提供了 AbortWait 方法来中止一个事件的等待,WaitFor 此时返回 wrAbandoned。
- 调用 AddTerminateProc 注册回调函数,在用户调用 Application.Terminate 结束程序时,会中断所有关联事件的等待,并返回 wrAbandoned。
- 由于使用了栈上变量定义的方式,所以避免了堆 上内存分配造成的效率问题。
TAbortableEvent 的原型定义参考如下:
PAbortableEvent = ^TAbortableEvent;
TAbortableEvent = record
private
class var First, Last: PAbortableEvent;
private
Prior, Next: PAbortableEvent;
Event: TEvent;
Aborted: Boolean;
procedure InsertWait(AEvent: TEvent);
procedure RemoveWait;
public
function WaitFor(AEvent: TEvent; const ATimeout: Cardinal): TWaitResult;
procedure AbortWait;
class procedure AbortAll; static;
end;
公开三个函数:
- WaitFor 替代 TEvent.WaitFor 来执行实际的等待
- AbortWait 中止当前等待并使等待的线程返回 wrAbandoned
- AbortAll 中止所有等待的事件并使所有等待的线程返回 wrAbandoned
QWorker 中的 MsgWaitForEvent 内部使用了它,后续版本会更新。