有意思!(50分)

  • 主题发起人 主题发起人 masm
  • 开始时间 开始时间
M

masm

Unregistered / Unconfirmed
GUEST, unregistred user!
有以下代码:
...
procedure TUP.Execute;
begin
Synchronize(Play);
end;
procedure TUP.Play;
begin
Form1.Caption:='wqrdwaeqf';
end;
线程一执行,主Form的Caption改变成wqrdwaeqf,一切正常
把代码改变成:
procedure TUP.Execute;
begin
Form1.Caption:='wqrdwaeqf';
end;
主Form的Caption居然不见了;
如果改变的是主Form里的Label1.Caption则上述两段代码执行结果一样!!!
这是为什么啊?

 
maybe the temporary string have been freed when main thread send WM_SETTEXT message
 
线程同步的问题,VCL控件一般为非线程安全的,访问VCL应该使用Synchronize让主线程去执行!
 
我只有一个线程,还要考虑同步问题?难不成Form.Caption还有一个幕后在不断地刷新????
 
Windows本身就会通知程序重绘,所以不能以为“只有一个”线程在对Caption操作,用Synchronize或Postmessage来更新吧
 
问题的实质好象也不是你们说的那样.
 
访问VCL可视控件用Synchronize,
D5里好像有个线程的例子,你打开研究研究。
 
>我只有一个线程,还要考虑同步问题?难不成Form.Caption还有一个幕后在不断地刷新????
你说的不对,虽然你只创建了一个创建,但是还有一个主线程,所以两个线程是多线程,VCL组件基本上都不是线程安全的,不支持同时多个线程访问,你用Lable的时候没有问题是因为在你的子线程给它的Caption赋值的时候,主线程并没有访问它,而Form就不同了。它一直在不停的检索处理消息。所以会出现你所说的现像,正如楼上几位说的,在访问VCL可视组件的时候最好用Synchronize
 
因为form1还没创建
 
多人接受答案了。
 
后退
顶部