+ -
当前位置:首页 → 问答吧 → 和线程相关的一个问题

和线程相关的一个问题

时间:2011-10-08

来源:互联网

{$R *.dfm}

type
  mythread=class(tthread)
  protected
  procedure execute;override;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
mythread.Create(false);
end;

{ mythread }

procedure mythread.execute;
var i:integer;
begin
  inherited;
  freeonterminate:=true;
  for i := 0 to 10000 do begin
  form1.Edit1.Text:=inttostr(i);
  Form1.Canvas.TextOut(10, 10, IntToStr(i));
  form1.Edit1.Refresh;
  end;
end;


运行时,单击button1,edit1没有显示为10000
  edit1和(10,10)处的i不一致

请问是什么原因

谢谢

作者: uestcwang   发布时间: 2011-10-08

lz的所讲不属实。

首先,你应该在canvas.textout之上加线程安全代码
Delphi(Pascal) code

  Form1.Canvas.Lock;
  Form1.Canvas.TextOut(10, 10, IntToStr(i));
  Form1.Canvas.Unlock;



如果只点击一次按钮直到运行完成,看起来应该不会不一致。若多次点击按钮(也就是多个线程同时进行),应该会出现乱跳的的情况,因为显示的是不同线程中的i。因这个i是线程局部变量,不会被多线程破坏,应该在每一次refresh后,textout和edit1中的值是一致的。

作者: truexf   发布时间: 2011-10-08

太快了吧 是不是Canvas跟不上

后面加一个sleep(50),就可以跑到10000了

如果还不行就再设大一点

form1.Edit1.Refresh;这个感觉没啥用

作者: gkulm1775   发布时间: 2011-10-08

热门下载

更多