+ -
当前位置:首页 → 问答吧 → 多线程里的 Synchronize 请教!

多线程里的 Synchronize 请教!

时间:2011-11-03

来源:互联网

因为一个工程项目,所以我像请教下多线程的 一个技巧!

procedure MyThread.SynchroEvent1;
var
  WaitReturn : DWord ;
  I:Integer;
begin
  For I:=0 to 99999999 do Form1.Label3.Caption :=Inttostr(I);
end;

constructor MyThread.Create(lbl:TLabel;sleepSec:Integer); //参数传递
begin
  FLabel:=lbl;
  FSleepDec:=sleepSec;
  FreeOnTerminate:=True; //让线程终止是触发OnTerminate事件
  inherited Create(True);//不立即执行,只有调用resume才开始
end;


procedure MyThread.Execute;
var
  i:Integer;
begin
  for i:=0 to 1000 do begin
  if Terminated then Break;
  FLabel.Caption:=IntToStr(i);
  Sleep(FSleepDec);
  SynchroEvent1;
  end;
end;

如果在Synchronize里使用了循环的话就会使程序卡死,工程里必须同步并且有循环!我像请教大家如何解决?

作者: jiangjunad   发布时间: 2011-11-03

第一,不要直接在线程里操作VCL。
第二,把要同步的部分这么使用Synchronize(SynchroEvent1)
第三,SynchroEvent1应该简单,只包括循环内的部分就可以了。在Execute里加上For I:=0 to 99999999 do Synchronize(SynchroEvent1);
第四,循环很快的,不要每次都显示,SynchroEvent1里面if(i mod 13243=0) then Form1.Label3.Caption :=Inttostr(I);就可以了。

作者: lhylhy   发布时间: 2011-11-03

把i设成MyThread的成员变量。

作者: lhylhy   发布时间: 2011-11-03