请问我用多线程做的进度条怎么不刷新,成灰色的一片(50分)

  • 主题发起人 主题发起人 timsky
  • 开始时间 开始时间
T

timsky

Unregistered / Unconfirmed
GUEST, unregistred user!
做3层的时候,有些操作耗时比较长,我就用多线程做了一个等待窗口,就像一个进度条一样不断的动,但是为什么用的时候就成灰色的一片,好像没有刷新呢?
 
这种描述叫人如何对症下药?
方便的话贴出代码
 
用了同步?
问题可以是任意原因的,没代码无法分析。
除非有人也遇到过这个问题。
 
unit fm_bar;
interface
uses
Forms,Classes,sysutils;
type
TSBar = class(TThread)
private
{ Private declarations }
protected
procedure Execute;
override;
end;

implementation
uses Graphics,fm_conn,data_sys_frm;
{ TSBar }
procedure TSBar.Execute;
begin
with fm_conn_frm.CBardo
begin
sleep(50);
Position:=Position+1;
if Position=100 then
position:=0;
end;
end;

在formcreate的时候启动这个线程
DSBar:=TSBar.Create(True);
DSBar.FreeOnTerminate:=true;
DSBar.Resume;
 
看看 你的Execute 中的代码
只执行一次呀,加个循环啊。
不过你要和你处理数据的线程做好同步。
 
注意同步啊
你这样直接操作VCL是会出问题的。
用synchornize
 
程序发少了一点,有循环的
 
哪一步用synchornize啊?
 
对进度条操作部分用synchornize(过程名)
过程:
对进条操作
 
在循环过程中添加:
Ppplication.PostMessage;
 
application.ProcessMessages加过了,完全不起作用,
 
unit fm_bar;
interface
uses
Forms,Classes,sysutils;
type
TSBar = class(TThread)
private
{ Private declarations }
procedure test;
protected
procedure Execute;
override;
end;

implementation
uses Graphics,fm_conn,data_sys_frm;
{ TSBar }
procedure TSBar.Execute;
begin
while not terminateddo
begin
synchornize(test);
end;
end;

procedure TSBar.test;
begin
with fm_conn_frm.CBardo
begin
sleep(50);
Position:=Position+1;
if Position=100 then
position:=0;
end;
end;

这么试试吧,有可能synchornize写错了,懒得记,自己看看吧。
 
另外,还要用语句重画带进度条的窗体.
如update,或者Repaint之类的语句.
这样才能更新进度条的显示.
Position:=Position+1;好像这样用比较好吧:
Stepit;
 
没做同步是这样的
我喜欢用一个 avi 动画.
 
唉,终于弄好了,原来要在循环里面加一个form.update,不要synchronize,晕.
 
来晚了,问题解决了。[:)]
 
接受答案了.
 
后退
顶部