Delphi TCriticalSection获取与输入-有什么区别?

问题描述

我正在更新仅使用TCriticalSection.Acquire/Release对而不是Enter/Release or Leave对的Delphi(Delphi 2009)代码。我的问题是-AcquireEnter有什么区别?

Delphi文档非常模糊-它甚至试图说没有区别:

http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/!!MEMBERTYPE_Methods_SyncObjs_TCriticalSection.html

获取:将关键部分绑定到调用线程。呼叫 获得阻止所有其他线程获得此关键 直到调用Release或Leave方法获取执行 与Enter方法相同。

Enter:在调用线程进入 线程敏感部分。调用Enter阻止其他所有线程 输入此关键部分保护的代码,直到请假或 释放方法调用。 Enter调用Acquire方法来绑定 调用线程的关键部分。

我想使用方法TryAcquire,但是没有这样的方法,因此-我正在考虑将我对Acquire的所有调用替换为TryEnter... Sleep...循环,该循环是有界的通过TryEnter调用次数数量。但是要确定会发生什么,我应该知道AcquireEnter间的区别吗?这有什么区别?为什么要使用两种不同的方法

解决方法

对于TCriticalSection没有区别。 Enter被实现为对Acquire的调用。对于Leave也是如此,它被实现为对Release的调用。

TryEnter方法是在Delphi 2009之后添加的。但这只是Windows API调用TryEnterCriticalSection的简单包装。您可以自己直接调用该函数。例如,您可以使用类帮助器将TryEnter引入TCriticalSection的范围内。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...