加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Delphi 10的TMonitor线程控制对象的用法

(2016-02-17 16:23:30)
分类: Delphi10
Delphi2009 增加一个新的TMonitor对象,用来为线程加锁与解锁,控制线程安全的执行。直到现在才无意中发现这个类。

来看一下这个TMonitor最基本的用法:
function TTimerManager.TTimerEventQueue.PopItem(var AQueueSize: Integer; var AItem: TFmxHandle): TWaitResult;
begin
  TMonitor.Enter(FLock);
  try
  ....
  finally
    TMonitor.Exit(FLock);
  end;
end;
其中,FLock为TObject类型,在TTimerManager.TTimerEventQueue.Create中建立
constructor TTimerManager.TTimerEventQueue.Create;
begin
  FLock := TObject.Create;
...
正如你看到的,很简单。
打开System单元,会进一步看到TMonitor的声明,这时只看Public部分,即供我们调用的方法,看似简单,但仔细查看每个方法具体的实现,会发现这个TMonitor是跨平台的,适应所有平台。
  public
    class procedure SetSpinCount(const AObject: TObject; ASpinCount: Integer); static;
    class procedure Enter(const AObject: TObject); overload; static; inline;
    class function Enter(const AObject: TObject; Timeout: Cardinal): Boolean; overload; static;
    class procedure Exit(const AObject: TObject); overload; static;
    class function TryEnter(const AObject: TObject): Boolean; overload; static;
    class function Wait(const AObject: TObject; Timeout: Cardinal): Boolean; overload; static;
    class function Wait(const AObject, ALock: TObject; Timeout: Cardinal): Boolean; overload; static;
    class procedure Pulse(const AObject: TObject); overload; static;
    class procedure PulseAll(const AObject: TObject); overload; static;
    class property DefaultSpinCount: Integer read FDefaultSpinCount write SetDefaultSpinCount;
  end;
进一步查看这个TMonitor,在delphi的源码中大量被使用,所以得出结论,对于线程安全的控制,我们也应该用他来实现,摒弃原来windows上的用法。

不得不说,这么重要的TMonitor,帮助文档中竟没有说明,可惜。

参考文档

另外,有几个外文的资料可以看看。
TMonitor vs TRTLCriticalSection
Monitoring the Monitor
What is TMonitor in Delphi System unit good for?
C# Monitor Wait()和Pulse()

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有