以下的程序完全摘自delphi5开发人员指南的多线程章节。我也是刚开始看多线程的内容,还请各位高手指导下小弟。。    多谢多谢啊  
   
   看了下面短短的程序有3个问题,问题1和问题2标在程序里了  
   问题3:多线程的临界区是不是只能用在用一个线程类多个不同对象之间的。对于两个线程类的各自的子线程之间是不需要考虑同步问题的??  
 
 
验证一个整数数组,现在第一遍把这个数组赋初值为1到128,第二遍将这个数组赋初值为128到255,然后显示在列表框中。这里用两个线程分别进行初始化。  
 
unit  main;  
interface  
 
uses    
   windows,messages,sysutils,classes,graphics,controls,forms,dialogs,stdctrls;  
 
type  
   Tmainform  =  class(Tfrom)  
   button1:  Tbutton  
   listbox1:Tlistbox  
   procedure  button1click(sender:  Tobject);  
private  
   procedure  threadsdone(sender:  Tobject);  
end;  
 
var    
   Mainfrom:  TMainform;  
 
implementation  
 
const  
   MaxSize=  128;  
 
var  
   nextnumber:  integer=0;  
   doneflages:integer=0;  
   globalarray:array[1..maxsize]  of  integer;  
 
function  getnextnumber:  integer;  
begin  
   resule  :=Nextnumber;  //return  global  var  
   Inc(nextnumber);          //inc  global  var  
end;  
 
procedure  Tfoothread.execute;  
var  
   i:  integer  
begin  
   onterminate  :=  mainform.threadsdone;    //问题1,这是什么意思啊??  
   for  i:=  1  to  maxsize  do  
     begin  
         globalarray[i]  :=  getnextnumber;    //set  array  element  
         sleep(5);                                                    
     end;  
end;  
 
procedure  Tmainform.threaddone(sender:  Tobject);  
var  
   i:  integer;  
begin  
   inc(doneflags);  
   if  doneflag  =  2  then    //make  sure  both  threads  finished  
                                               //问题2,为什么doneflag=2的时候表示两个线程都结束了  
     begin  
         for  i:=  1  to  maxsize  do  
             {fill  listbox  with  array  contents}  
             listbox1.items.add(inttostr(globalarray[i]));  
end;  
 
procedure  Tmainform.button1click(sender:  Tobject);  
begin  
   Tfoothread.create(false);    //create  threads;  
   Tfoothread.create(false);  
end;  
 
end.  

解决方案 »

  1.   

    >>onterminate  :=  mainform.threadsdone;    //问题1,这是什么意思啊??  
    本线程的OnTerminate(结束事件,在 MainForm中 的 threadsdone 中处理)>>    //问题2,为什么doneflag=2的时候表示两个线程都结束了  
    在本例子中,运行两个线程,两个结束时都会调用
    procedure  Tmainform.threaddone(sender:  Tobject); 
    这个过程,而每调用一次,就
      inc(doneflags); //增加计数 1
    也就是,第二个线程结束时,就会满足调用if  doneflag  =  2  then    
     ....
      

  2.   

    前两个问题aiirii已经解释的很清楚了
    3。设置临界区就是为了 某一时刻 资源只能被一个线程访问 
       对于两个线程类之间是同样的道理