{$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不一致请问是什么原因谢谢

解决方案 »

  1.   

    lz的所讲不属实。首先,你应该在canvas.textout之上加线程安全代码  Form1.Canvas.Lock;
      Form1.Canvas.TextOut(10, 10, IntToStr(i));
      Form1.Canvas.Unlock;
    如果只点击一次按钮直到运行完成,看起来应该不会不一致。若多次点击按钮(也就是多个线程同时进行),应该会出现乱跳的的情况,因为显示的是不同线程中的i。因这个i是线程局部变量,不会被多线程破坏,应该在每一次refresh后,textout和edit1中的值是一致的。
      

  2.   

    太快了吧 是不是Canvas跟不上后面加一个sleep(50),就可以跑到10000了如果还不行就再设大一点form1.Edit1.Refresh;这个感觉没啥用
      

  3.   

    在canvas上画,只画不刷新,你根本看不到变换效果,要发送 WM_Paint或者调用Invalidate
      

  4.   

    form1.Edit1.Text:=inttostr(i);
    线程中不能直接访问VCL控件,得用Synchronize。
      

  5.   

    32143041 delphi技术全,大牛具多,不可错过