procedure TIniThread.Execute;
var
  i: integer;
begin
  OnTerminate := MainForm.ThreadsDone;
  for i := 1 to MaxSize do
  begin
    GlobalArray[i] := GetNextNum;
    Sleep(5);
  end;
end;procedure TMainForm.Button1Click(Sender: TObject);
begin
  TIniThread.Create(false);
  TIniThread.Create(false);
end;procedure TMainForm.ThreadsDone(Sender: TObject);
var
  i: integer;
begin
  Inc(DoneFlags);
  if DoneFlags = 2 then
    for i := 1 to MaxSize do
      ListBox1.Items.Add(IntToStr(GlobalArray[i]));
end;
end.
一:Button1Click生成2个线程后,Execute是不是自动调用?
二:OnTerminate := MainForm.ThreadsDone。OnTerminate 是一个事件,怎么好负值呢?线程到底是用什么来判断该现成结束?
三:ThreadsDone线程结束后处理怎么调用他的?

解决方案 »

  1.   

    线程执行的时候自然就会调用execute方法
    OnTerminate是一个可控制属性,可以在主线程中进行赋值
    当线程检测到这个属性为FLASE的时候终止执行
    ThreadsDone检测到如果两个线程都执行完毕后把结果列入LISTBOX
    偶也是初学线程,也许狗屁不通,呵呵,错了别怪
      

  2.   

    1. TIniThread.Create(false);你这里写了false就马上执行
    2. OnTerminate是一个事件句柄,当线程结束后就调用这个句柄指向的代码,要线程结束的方法是调用线程的Terminate方法,但这个方法并不强制结束线程,它实际上是把一个保护的成员变量Terminated设置为True,你在线程的Execute方法中应该经常检查这个变量,如果为True就要自己结束线程,只要你退出Execute方法线程就结束了。像你这个例子Execute方法并没有检查Terminated变量,所以只能等到循环结束后才能结束线程
    3. 这个就是你前面OnTerminate := MainForm.ThreadsDone这句起的作用啊,Thread会在线程结束后就调用这个OnTerminate指向的代码,你这里就指向MainForm.ThreadsDone
    另外这句最好放在主线程设置,因为涉及到线程安全的问题,在线程类里面不要访问mainform,同时为了能够有机会设置你在创建线程时候应该用TIniThread.Create(True);设置完后再调用resume方法启动线程