大家看看这段代码!(50分)

  • 主题发起人 主题发起人 coolbaby
  • 开始时间 开始时间
C

coolbaby

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure tbarpos.Execute;
begin
while truedo
begin

form1.statusbar1.Panels[2].Text:='当前帧:'+inttostr(form1.myplayer.CurrentFrame);
Synchronize(UpdateCaption);
sleep(100);
end;
end;

procedure tbarpos.UpdateCaption;
begin
form1.prob.Position:=3;
//form1.prob.Position:=round(strtofloat(inttostr(form1.myplayer.CurrentFrame))/strtofloat(inttostr(form1.myplayer.TotalFrames))*strtofloat(inttostr(form1.prob.Max)));
end;

如果我把form1.prob.Position:=3;一句去掉,程序正常,就是说对form1.statusbar1.Panels[2].Text
的调用正常。那为什么对prob(是一个trackbar)的调用不行呢?
而且还用了synchronize(不用那个也不行)。
请高手赐教!
 
多线程高手,大家来看看!
 
将form1.statusbar1.Panels[2].Text这一句放到UpdateCaption过程中试试
 
那一句放不放都无所谓,不会出错
关键是下面一句!
 
请说详细一点,到底出了什么错啊?
 
线程内部队VCL 界面控件的操作封装到Synchronize(<procedure>)方法里面,
这是常识呀,老大。
 
VCL这种东西对线程安全支持得不是很好,只要在线程当中调用其它FORM中的内容就有可能
会出错。所以宝兰封装了一个线程类来做一点补救。其中Synchronize函数就是具体的补救
方法。其具体运作方式是:发消息给线程类建立时所建立的隐藏的窗口),注意这个窗口
是在主线程中建立的,所以可以安全访问VCL资源,然后再通过这个窗口中的消息函数来对
你要做的操作(函数)进行执行。这样就不会出错了。
 
这些道理我都知道,上面就是那么做的呀
可是为什么出错呢?
 
UpdateCaption不就是放在synchronize里么
其中的prob是一个刻度条控件
对他操作会出错
多状态栏操作就不会出错呢!?
 
procedure tbarpos.Execute;
begin
while truedo
begin

Synchronize(UpdateCaption);
sleep(100);
end;
end;

procedure tbarpos.UpdateCaption;
begin
form1.statusbar1.Panels[2].Text:='当前帧:'+inttostr(form1.myplayer.CurrentFrame);
form1.prob.Position:=3;
//form1.prob.Position:=round(strtofloat(inttostr(form1.myplayer.CurrentFrame))/strtofloat(inttostr(form1.myplayer.TotalFrames))*strtofloat(inttostr(form1.prob.Max)));
end;

 
为什么去掉Prob的操作就不会出错呢?因为在Execute中对Form1进行了操作,在UpdateCaption也对Form1进行了操作(要知道对VCL操作时同时也会对其父控件进行操作,比如Prob的改变就会导致Form1的重绘,同样Statusbar1的操作也一样!)。
 
那该怎么办?
 
ok,解决,我自己的问题
和多线程没关系
一点分,大家分了吧
 

Similar threads

I
回复
0
查看
746
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
559
import
I
后退
顶部