互斥控制是为了避免一个线程在使用某一个对象或全局变量与其他线程发生冲突。实现线程互斥的方法有:
(1)访问代码委托给VCL主线程执行。在线程中若要调用可视化的方法或访问其属性,可将执行代码委托给VCL主线程执行,否则会发生并发访问冲突。委托的方法是先将使用可视化组件的代码单独编成一个函数,函数原型是void 函数名(void),然后电泳TThread类的成员函数Synchronize(函数名)来调用它,VCL主线程顺序执行所有组建对该组建的访问(包括响应人机界面事件、windows系统事件等),从而不会发生冲突。
(2)使用对象锁。有些VCL类提供对象锁,可以使用对象的LOCK与UNLOCK方法进行加锁与解锁。当访问这些对象时,可调用LOCK方法锁住对象,然后访问该对象,访问完毕后调用对象的UNLOCK方法释放该对象。
(3)使用临界区对象。若要访问一个全局变量,则可设置一个临界区对象(TCritical Section)来实现互斥,该对象有Acquire与Release两个方法。Acquire方法阻塞其他线程,执行临界区代码,而Release方法释放等待进入临界区的线程。例如:设Q为全局变量,Crit1为临界区对象,在访问Q进入临界区时须执行Crit1.Acquire(),访问后退出临界区时须执行Crit1.Release()。
ps:实际应用中第二种方法会提示LOCK和UNLOCK函数没有定义。第三种方法行得通,推荐使用。