本帖最后由 cowboamo 于 2012-12-06 22:04:59 编辑

解决方案 »

  1.   

    { TMyThread2 }procedure TMyThread2.calt;
    begin
      ps1.StepBy(1);
    end;constructor TMyThread2.Create(parent: TProgressBar);
    begin
      ps1 := parent;
      inherited Create(False);
    end;procedure TMyThread2.Execute;
    begin
      ps1.Max := L;
      for i := 1 to ps1.Max do
      begin
        if Terminated then
          Break;
        synchronize(calt);
      end;
    end;
      

  2.   


    { TMyThread2 }procedure TMyThread2.calt;
    begin
      ps1.StepBy(1);
    end;constructor TMyThread2.Create(parent: TProgressBar);
    begin
      ps1 := parent;
      inherited Create(False);
    end;procedure TMyThread2.Execute;
    begin
      ps1.Max := L;
      for i := 1 to ps1.Max do
      begin
        Sleep(10);//要加上Sleep,否则会CPU 100%
        if Terminated then
          Break;
        synchronize(calt);
      end;
    end;
      

  3.   

    这个线程执行过程中的确是高cpu,你可以创建多个thread,每个的占用率就会降下来
    单个的话,可以加sleep
      

  4.   

    你在线程的 Execute 里使用 synchronize(calt) ,还是相当于在主线程中执行,完全没有起到线程的做用。
    先定义一个消息
    WM_MyMessage=WM_USER+2000;
    定义一个进度的变量
      app_Position:Integer;
    窗体接收这个消息
    public
      procedure OnWM_MyMessage(var mes:tmessage);message WM_MyMessage;
    begin
      ProgressBar1:=app_Position;
    end;//将窗体的 Handle 在创建线程里给传入,线程里执行
    procedure TMyThread2.Execute;
    begin
        while true do
        begin
           //执行要完成的工作,
           inc(app_Position);
           postmessage(formHandle,WM_MyMessage,0,0);
           sleep(100); //如果感觉太快或太慢,可以调整
        end; 
    end;也可以不用消息,窗体上放一个定时器,每一秒去刷新一下进度条的值
    其实用定时器的方式最简单,也不至于一下就到头了。
      

  5.   

    将占用时长的代码写在线程里。
    synchronize是将过程加载到主线程执行。
    你这里的calt过程这样写,明显将耗时的循环在主线程执行了,肯定会使界面卡死,CPU占用高的。