小弟刚刚接触Delphi的多线程问题:不知道如何对线程的临界区进行操作。临界区是个什么概念?是在线程的执行过程中执行呢?
我用了一个死循环作条件,基本如下
while not terminated do
begin
   ....
   case 1: doSomething1;(doSomething1中含有对VCL控件的操作);
   case 2: dosomething2;
   .....
   end;
end;
临界区是用在dosomething1中写呢?还是在线程中写?
我是个这方面的白痴,请大家多多赐教啊

解决方案 »

  1.   

    可能被多个线程同时访问的资源,在每个使用该资源的地方都要用临界区限制。
    象你这种情况,应当用 Synchronize(doSomething1) 来调用,否则的话在主线程中用到该 VCL 控件的地方也要用临界区限制。
      

  2.   

    Synchronize是为了在TThread类中访问非一程的VCL对象时使用的方法。
    Synchronize被调用时,调用的线程成为主线程的一部分来工作,在这个时候,VCL对象不会接受其他的消息了,也就不会出现多个线程同时访问VCL对象而引起的冲突。
    在Synchronize内调用的代码应尽量短。
    对不会引起冲突的VCL对象可以不使用Synchronize方法。一楼hiflower(花)的意见正确
      

  3.   

    VCL 是不支持多线程同时访问的,特别是界面相关的控件,一般都不支持。所以你在线程中要访问这些东西,就要保证你访问的时候其他线程(比如主线程)没有和你当前的这个线程同时访问这些资源。这就是使用临界区的原因。比如你在线程里要访问主窗体上的一个TListView,就要把访问ListView的这段代码放到临界区里面,防止本线程读写的时候另外一个线程又来读写这个TListView。这样进行同步的方法不只是临界区一种。
      

  4.   

    “临界区”和“互斥量”的作用一样,都是在多线程环境下(注意,可能同时又是多进程)保护一组或一片相关的存储资源的。如一个记录,一张表格等,其操作特点是要保证其内容的完整性,因此,在一个线程正在修改且还未完成时,是不允许另外的线程读取的,否则读取的信息会不完整、设置导致数据错误。这是就需要“临界区”(在同一个进程时)或“互斥量”(在不同进程中——如共享内存)老保护。特别提醒:“临界区”和“互斥量”都是操作系统的概念,不是Delphi的概念。
        “临界区”和“互斥量”用法:
       假如有一个记录 MyRecord,内含多项内容;定义“临界区”或“互斥量”Mutex   线程A要操作MyRecord:
       步骤1:获取Mutex的控制权,如果此时有其他线程正在控制着Mutex,则本线程被锁定;直到Mutex被释放;
       步骤2:线程A获得了Mutex控制权,实施对MyRecord的操作;
       步骤3:操作完成,释放Mutex控制权。