如何解决大量读写文件占用系统资源问题? 我在一个程序里需要大量处理文件:点击一按钮之后,开始用TFILESTREAM读进文件,经过格式转换后写到另外一个文件中,总共要处理几百个这样的文件。现在的问题是,在处理过程中程序就象死机了一样,不能动了,点击没有任何反应。请问,如何解决这个问题? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 delphi 里面有例子的E:\Program Files\Borland\Delphi7\Demos\Threads 在处理过程中用application.ProcessMessages;就不会出现你说的像死机一样的现象了! 新建一个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. 漏了一句:Unit1 里还要设置 Form1 的 OnCloseQuery 事件的处理程序为 FormCloseQuery。 UDP防火墙问题 ???如何获得用户在DBGridEh的picklist下拉框中选择的是哪个值??? 问个菜鸟问题,请勿见笑,在线急等,望指教 小问题,请高手解救?? 关于窗体的菜鸟级问题~~~~急,在线等 组件问题 高手出招,如解决必送分。 小弟有字符处理的问题不太明白,想请教一下各位高手 dephi中对条形码扫描输入接口的问题。 我快要急死了,各位大虾,帮帮我吧.一个关于使用QuickRep分页打印的问题 请问如何搜索到局域网内所有的机器(得到名称和IP),并且如何把机器上指定位置的文件拷贝到本机?(Up有分!) 提问:有关DBGrid中记录的任意多行多列的复制
E:\Program Files\Borland\Delphi7\Demos\Threads
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.