这是我第一次尝试使用 Threads
,我正在尝试使用一个 Thread
来复制一个目录,以下是我所做的(在阅读了 这篇文章 之后):
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.IOUtils, System.Types;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TMyThread= class(TThread)
private
Fsource, FDest: String;
protected
public
constructor Create(Const Source, Dest: string);
destructor Destroy; override;
procedure Execute(); override;
published
end;
var
Form1: TForm1;
MT: TMyThread;
implementation
{$R *.dfm}
{ TMyThread }
constructor TMyThread.Create(const Source, Dest: string);
begin
Fsource:= Source;
FDest:= Dest;
end;
destructor TMyThread.Destroy;
begin
inherited;
end;
procedure TMyThread.Execute;
var Dir: TDirectory;
begin
inherited;
try
Dir.Copy(Fsource, FDest);
except on E: Exception do
ShowMessage(E.Message);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
MT := TMyThread.Create('SourceFolder', 'DestinationFolder');
try
MT.Execute;
finally
MT.Free;
end;
end;
end.
当我点击
Button1
时,出现以下错误信息:
这是什么问题?我对线程不是很了解,我甚至尝试过:Cannot call Start on a running or suspended thread
MT := TMyThread.Create('SourceFolder', 'DestinationFolder');
Execute
,框架会自动调用。你只需在主线程中执行它。不要在线程中调用ShowMessage
。不能在主线程之外操作GUI。 - David HeffernanTThread
的任何构造函数。 - nilExecute
方法中调用inherited
没有意义,因为它会覆盖一个抽象方法。不要声明一个类型为TDirectory
的变量。Copy
方法是一个类方法。使用TDirectory.Copy
。如果你不理解 @nil 的评论,你需要在你的线程类构造函数中添加一个inherited
。 - David HeffernanSetFreeOnTerminate(True);
还是线程会自动释放? - Ilyes