【教程】对 TEvent 的一处增强

对于 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 内部使用了它,后续版本会更新。

分享到: