我在一个程序里需要大量处理文件:点击一按钮之后,开始用TFILESTREAM读进文件,经过格式转换后写到另外一个文件中,总共要处理几百个这样的文件。
现在的问题是,在处理过程中程序就象死机了一样,不能动了,点击没有任何反应。
请问,如何解决这个问题?

解决方案 »

  1.   

    delphi 里面有例子的
    E:\Program Files\Borland\Delphi7\Demos\Threads
      

  2.   

    在处理过程中用application.ProcessMessages;就不会出现你说的像死机一样的现象了!
      

  3.   

    新建一个Project,在Form1上放一个Button,然后双击Button1,贴入下面的代码:unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
        procedure Button1Click(Sender: TObject);
        procedure ThreadSaveTerminate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementationuses Unit2;var
      ThreadSave: TThreadSaveFile;{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin
      ThreadSave := TThreadSaveFile.Create('C:\1.txt');
      ThreadSave.FreeOnTerminate := True;
      ThreadSave.OnTerminate := ThreadSaveTerminate;
      ThreadSave.Resume;
    end;procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    begin
      if Assigned(ThreadSave) then
      begin
        ThreadSave.Terminate;
        while Assigned(ThreadSave) do
          Application.ProcessMessages;
      end;
    end;procedure TForm1.ThreadSaveTerminate(Sender: TObject);
    begin
      ThreadSave := nil;
    end;end.
    然后,File->New->Unit,在Unit2中粘贴代码如下:unit Unit2;interfaceuses
      Classes;type
      TThreadSaveFile = class(TThread)
        constructor Create(const FileName: string);
        destructor Destroy; override;
      private
        { Private declarations }
        FFileName: string;
        FCount: Integer;
        procedure UpdateCaption;
      protected
        procedure Execute; override;
      end;implementationuses Unit1, SysUtils;{ TThreadSaveFile }constructor TThreadSaveFile.Create(const FileName: string);
    begin
      FFileName := FileName;
      inherited Create(True);
    end;destructor TThreadSaveFile.Destroy;
    begin
      inherited;
    end;procedure TThreadSaveFile.Execute;
    var
      Stream: TFileStream;
    begin
      { Place thread code here }
      Stream := TFileStream.Create(FFileName, fmOpenReadWrite); // fmOpenReadWrite = 2
      try
        while not Terminated do
        begin
          Stream.Seek(0, soFromEnd);
          Stream.Write('0123456789', 10);
          Inc(FCount);
          Synchronize(UpdateCaption);
        end;
      finally
        Stream.Free;
      end;
    end;procedure TThreadSaveFile.UpdateCaption;
    begin
      Form1.Caption := Format('Writing %d times', [FCount]);
    end;end.
      

  4.   

    漏了一句:Unit1 里还要设置 Form1 的 OnCloseQuery 事件的处理程序为 FormCloseQuery。