procedure TTest.execute;
var
i:integer;
begin
    FreeOnTerminate:=true;
    enterCriticalSection(CS);
     for i:=1 to maxsize do
            begin
               inc(incnum);
               TT[i]:=incnum;
               sleep(5);   //这一句是否每循环一次就睡眠五秒,并且不执行下一个线程
            end;end;
procedure Tform1.T1done(sender:Tobject);
var
i:Integer;
begin
   listbox1.Items.Clear;
        for i:=1 to maxsize do
              begin
                 listbox1.Items.Add(inttostr(TT[i]));
               end;
    leavecriticalsection(cs);
end;
procedure Tform1.T2done(sender:Tobject);
var
i:integer;
begin
       listbox2.Items.Clear;
       for i:=1 to maxsize do
             listbox2.Items.Add(inttostr(TT[i]));
  leavecriticalsection(cs);end;
procedure TForm1.Button1Click(Sender: TObject);//执行线程
begin
  initializeCriticalSection(CS);
  T1:=TTest.Create(false);
  T1.OnTerminate:=T1done;
  T2:=TTest.Create(false);
  T2.OnTerminate:=T2done;
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
deletecriticalsection(cs);
end;

解决方案 »

  1.   

    我在实际应用中真没用过多线程,仅在一些练习中写着玩。
    但就我所知,sleep API会令总个进程挂起,而不是让使用它的线程挂起。
      

  2.   

    for i:=1 to maxsize do
                begin
                   inc(incnum);
                   TT[i]:=incnum;
                   sleep(5);   //这一句是否每循环一次就睡眠五秒,并且不执行下一个线程
                end;
      

  3.   

    但就我所知,sleep API会令总个进程挂起,而不是让使用它的线程挂起。//  不是令整个进程挂起的 只是使自己暂时睡眠5ms 不是5秒!是 5ms...表示自己在这5MS中 不去睁抢CPU。sleep(5);   //这一句是否每循环一次就睡眠五秒,并且不执行下一个线程
    // 是 5MS 5毫秒 不是不执行下一个线程 而是不执行下一次循环是本线程的执行代码挂起5MS。。
      

  4.   

    procedure TForm1.Button1Click(Sender: TObject);//执行线程
    begin
      initializeCriticalSection(CS);
      T1:=TTest.Create(false);
      T1.OnTerminate:=T1done;
      T2:=TTest.Create(false);
      T2.OnTerminate:=T2done;
    end;
    我这里有二个线程,并使用了临界区。T1的execute中执行了sleep挂起后,是否是挂起5MS后再执行
    线程T2了.
    而我这个sleep又在循环中,是否每次都执行sleep挂起了
      

  5.   

    sleep会放出CPU给其他线程运行