小弟刚刚接触Delphi的多线程问题:不知道如何对线程的临界区进行操作。临界区是个什么概念?是在线程的执行过程中执行呢?
我用了一个死循环作条件,基本如下
while not terminated do
begin
....
case 1: doSomething1;(doSomething1中含有对VCL控件的操作);
case 2: dosomething2;
.....
end;
end;
临界区是用在dosomething1中写呢?还是在线程中写?
我是个这方面的白痴,请大家多多赐教啊
我用了一个死循环作条件,基本如下
while not terminated do
begin
....
case 1: doSomething1;(doSomething1中含有对VCL控件的操作);
case 2: dosomething2;
.....
end;
end;
临界区是用在dosomething1中写呢?还是在线程中写?
我是个这方面的白痴,请大家多多赐教啊
象你这种情况,应当用 Synchronize(doSomething1) 来调用,否则的话在主线程中用到该 VCL 控件的地方也要用临界区限制。
Synchronize被调用时,调用的线程成为主线程的一部分来工作,在这个时候,VCL对象不会接受其他的消息了,也就不会出现多个线程同时访问VCL对象而引起的冲突。
在Synchronize内调用的代码应尽量短。
对不会引起冲突的VCL对象可以不使用Synchronize方法。一楼hiflower(花)的意见正确
“临界区”和“互斥量”用法:
假如有一个记录 MyRecord,内含多项内容;定义“临界区”或“互斥量”Mutex 线程A要操作MyRecord:
步骤1:获取Mutex的控制权,如果此时有其他线程正在控制着Mutex,则本线程被锁定;直到Mutex被释放;
步骤2:线程A获得了Mutex控制权,实施对MyRecord的操作;
步骤3:操作完成,释放Mutex控制权。