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()
来看一下这个TMonitor最基本的用法:
function TTimerManager.TTimerEventQueue.PopItem(var AQueueSize: Integer; var AItem: TFmxHandle): TWaitResult;
begin
end;
其中,FLock为TObject类型,在TTimerManager.TTimerEventQueue.Create中建立
constructor TTimerManager.TTimerEventQueue.Create;
begin
...
正如你看到的,很简单。
打开System单元,会进一步看到TMonitor的声明,这时只看Public部分,即供我们调用的方法,看似简单,但仔细查看每个方法具体的实现,会发现这个TMonitor是跨平台的,适应所有平台。
进一步查看这个TMonitor,在delphi的源码中大量被使用,所以得出结论,对于线程安全的控制,我们也应该用他来实现,摒弃原来windows上的用法。
不得不说,这么重要的TMonitor,帮助文档中竟没有说明,可惜。
参考文档
另外,有几个外文的资料可以看看。
TMonitor vs TRTLCriticalSection
Monitoring the Monitor
What is TMonitor in Delphi System unit good for?
C# Monitor Wait()和Pulse()