首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

为什么用线程做的进度条不能同步?

2012-02-19 
为什么用线程做的进度条不能同步????????高手请进,在线等下面是我的线程:unitUnit2interfaceusesClasses,

为什么用线程做的进度条不能同步????????高手请进,在线等
下面是我的线程:
unit   Unit2;

interface

uses
    Classes,ComCtrls;

type
    mythread   =   class(TThread)
    private
        {   Private   declarations   }
        fProgressBar1:TProgressBar;
        procedure   pro_bar;

    protected
        procedure   Execute;   override;

    public
        constructor   Create(fp:   TProgressBar);
    end;

 
implementation


{   mythread   }


constructor   mythread.Create(fp:TProgressBar);
begin
    //赋初值
    fProgressBar1:=fp;
    fProgressBar1.Max:=80000;
    fProgressBar1.Position:=0;
    FreeOnTerminate   :=   True;
    inherited   Create(False);
end;

procedure   mythread.Execute;
begin
    Synchronize(pro_bar);
end;

procedure   mythread.pro_bar;
begin
    while   fProgressBar1.Position <> fProgressBar1.max   do
    begin
        fProgressBar1.Position:=fProgressBar1.Position+1;
    end;
end;

end.
下面是我的调用:
var
    Form3:   TForm3;

implementation

uses   Unit1,unit2;

{$R   *.dfm}
var   thrbar:mythread;    

procedure   TForm3.Button1Click(Sender:   TObject);
begin
    thrbar:=mythread.Create(ProgressBar1);
    //thrbar.WaitFor();
    form4.show;
end;

运行时当单击form3上的按钮时就不能同步操作了,比如最大化form3窗体,或者拖动它

[解决办法]
进度条不需要放在线程中吧。

线程是在执行一个费时的操作时为了好的界面反映才用。最主要是将执行的代码放在线程中执行,面进度条是界面元素,只是在主线程中响应的。



[解决办法]
直接发消息给主线程的进度条
[解决办法]
procedure mythread.pro_bar;
begin
while fProgressBar1.Position <> fProgressBar1.Max do
begin
fProgressBar1.Position := fProgressBar1.Position + 1;
Application.ProcessMessages;// 加上这句
end;
end;
[解决办法]
线程里
procedure mythread.Execute;
begin
PostMessage(fProgressBar1.Handle,PBM_STEPIT,0,0)
end;

热点排行