大虾帮看看,谢了..以下是示例代码,是关于文件压缩的,当文件多的时候,运行for循环时,
CPU就会100%,我在Click事件后加上MyThread,好像好一点点.请问:
1.这样的多线程安全吗?
2.ProgressBar1是用多线程运了吗?
3.请问如果要让下面的代码,在窗口一显示后ProgressBar1才从0开始执行,如何改?
为什么下面的代码我放到FormShow下的话,一运行到完了直接显示进度条到100%?procedure TInformForm.AddfileClick;
var
  MyThread:TThread;
  i: integer;
begin
      MyThread:=TThread.Create(true);   //建立线程
       MyThread.FreeOnTerminate :=True;       for i := 1 to 6000 do   //6000个文件
       begin
              ProgressBar1.StepBy(1);
              {略...}
       end;
end;

解决方案 »

  1.   

    这也叫多线程。
    你要设计一个线程类,从TThread继承,覆盖它的execute方法,在这个方法里运行你的处理过程
      

  2.   

    楼上大虾,请问为什么有时Execute里调用的窗体有时会不存在?窗体是手动加载的,SHOW显示的?
    下面的代码可以执行,但一样的代码移植到项目里就有问题了,
    请问是什么原因一般?
    unit Main;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ComCtrls;{声明多线程}
      type 
      TMyThread = class(TThread) 
      protected 
        procedure Execute; override; 
      end; 
      
    type
      TMainForm = class(TForm)
        ProgressBar1: TProgressBar;
        Button1: TButton;
        Button2: TButton;
        procedure FormShow(Sender: TObject);
        procedure Button2Click(Sender: TObject);  private
        { Private declarations }
      public
        { Public declarations }
      end;var
      MainForm: TMainForm;implementationuses Unit1;{$R *.dfm}procedure TMyThread.Execute; 
    var
      i:Integer;
    begin  FreeOnTerminate := True; {这可以让线程执行完毕后随即释放}          
      mainform.ProgressBar1.Max := 1000;  //--------------为什么mainform找不到?-------------
      for i := 1 to 1000 do
      begin
        mainform.ProgressBar1.StepBy(1);
      end;
      
    end;
    procedure TMainForm.FormShow(Sender: TObject);
    begin
        TMyThread.Create(False);  //调用
    end;procedure TMainForm.Button2Click(Sender: TObject);
    begin
            if not Assigned(Form2) then Form2.Free;
    Screen.Cursor:=crHourGlass; 
    Form2:=TForm2.Create(self);
    Form2.Position:=poScreenCenter;
    Screen.Cursor:=crDefault;
    Form2.Show;
    end;end.
      

  3.   

    不要在线程里直接操作主线程上的可视控件,极不安全。
    比较简单的做法是:在你的线程类里增加个MsgHandle,用来记录主线程的句柄,在Execute过程中可以用postmessage来向主界面反馈执行进度。
      

  4.   

    线程中调用主界面VCL要用同步函数Synchronize