procedure RefreshData;begin DataLock; GetData; GetSettings; CheckValues; ... DataUnlock;end;
因为总有一对锁定/解锁我开始考虑简化锁定/解锁方法,这将在不再需要时自动解锁资源.
所以我的想法是引入新程序,该程序将输入参数作为对precedure的引用.这将使我能够使用匿名方法.
代码将是这样的:
type TBaseProc = reference to procedure;procedure TMyObject.LockMethod(AMeth: TBaseProc);begin DataLock; try AMeth; finally DataUnlock; end;end;procedure TForm1.RefreshData;begin MyObject.LockMethod( procedure begin GetData; GetSettings; CheckValues; ... end; );end;
这种方法有任何意义,还是有更好甚至更简单的解决方案?
感谢致敬.
解决方法 这种方法远非完美,因为正如我从您的代码中所理解的那样,每个应用程序只有一个锁.当每个独立数据实体都有自己的锁时,它会更好.所以你会有一个像这样的抽象类:type TAbstractData = class private CriticalSection: TRtlCriticalSection public constructor Create; procedure Lock; procedure Unlock; destructor Destroy; overrIDe; end;
然后从这个实现锁定的抽象类继承其他类.
constructor TAbstractData .Create; begin inherited Create; InitializeCriticalSection(CriticalSection); end; procedure TAbstractData.Lock; begin EntercriticalSection(CriticalSection); end; procedure TAbstractData.Unlock; begin LeaveSection(CriticalSection); end; procedure TAbstractData.Destroy; begin DeleteCriticalSection(CriticalSection); inherited Destroy; end;
CriticalSection是迄今为止在windows中实现的最有效的同步分支.它几乎是免费的 – 除非存在线程争用,否则几乎不消耗任何系统资源,并且当只有一个线程使用数据时不会调用昂贵的上下文切换.
在我提交答案后,我在互联网上发现了一篇好文章 – http://blog.synopse.info/post/2016/01/09/Safe-locks-for-multi-thread-applications – 作者推荐了类似的方法.
总结以上是内存溢出为你收集整理的delphi – 使用单个命令锁定和解锁资源全部内容,希望文章能够帮你解决delphi – 使用单个命令锁定和解锁资源所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)