和线程相关的一个问题
时间: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不一致
请问是什么原因
谢谢
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
如果只点击一次按钮直到运行完成,看起来应该不会不一致。若多次点击按钮(也就是多个线程同时进行),应该会出现乱跳的的情况,因为显示的是不同线程中的i。因这个i是线程局部变量,不会被多线程破坏,应该在每一次refresh后,textout和edit1中的值是一致的。
首先,你应该在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;这个感觉没啥用
后面加一个sleep(50),就可以跑到10000了
如果还不行就再设大一点
form1.Edit1.Refresh;这个感觉没啥用
作者: gkulm1775 发布时间: 2011-10-08
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28