Multithreading 从线程Delphi返回字符串
我使用的是DelphiXe6 我有一个线程,在这里我传递了一个ID,并希望得到一个由该线程创建的字符串。我看了所有的例子,但它们都在线程运行时返回值,我只需要它在Terminate上 从窗体调用线程:Multithreading 从线程Delphi返回字符串,multithreading,delphi,return-value,delphi-xe6,Multithreading,Delphi,Return Value,Delphi Xe6,我使用的是DelphiXe6 我有一个线程,在这里我传递了一个ID,并希望得到一个由该线程创建的字符串。我看了所有的例子,但它们都在线程运行时返回值,我只需要它在Terminate上 从窗体调用线程: StringReturnedFromThread := PrintThread.Create(MacId); PrintThread = class(TThread) private MyReturnStr, PrinterMacId : String; publ
StringReturnedFromThread := PrintThread.Create(MacId);
PrintThread = class(TThread)
private
MyReturnStr, PrinterMacId : String;
public
constructor Create(MacId: String); reintroduce;
procedure OnThreadTerminate(Sender: TObject);
protected
procedure Execute; override;
end;
constructor PrintThread.Create(MacId: String);
begin
inherited Create(False);
OnTerminate := OnThreadTerminate;
FreeOnTerminate := True;
PrinterMacId := MacId;
end;
procedure PrintThread.Execute;
begin
PrepareConnection;
MyReturnStr:= RequestPrintJobs(PrinterMacId);
end;
procedure PrintThread.OnThreadTerminate(Sender: TObject);
begin
end;
感谢您的帮助。您需要拦截线程终止。一种方法是使用TThread.OnTerminate事件/回调 下面是一个示例代码 线程单元:
unit Processes;
interface
uses
System.Classes;
type
TProcess = class(TThread)
private
FReturnStr: string;
FMacId: string;
protected
procedure Execute; override;
public
property MacId: string read FMacId write FMacId;
property ReturnStr: string read FReturnStr write FReturnStr;
constructor Create;
end;
implementation
constructor TProcess.Create;
begin
inherited Create(True);
FreeOnTerminate := True;
end;
procedure TProcess.Execute;
begin
// Some hard calculation here
FReturnStr := FMacId + 'BLA';
end;
end.
线程使用:
uses Processes;
procedure TForm1.Button1Click(Sender: TObject);
var P: TProcess;
begin
// Create the thread
P := TProcess.Create;
// Initialize it
P.MacId := 'MID123';
// Callback handler
P.OnTerminate := OnProcessTerminate;
// Let's go
P.Start;
end;
procedure TForm1.OnProcessTerminate(Sender: TObject);
var P: TProcess;
begin
// The thread has been terminated
P := TProcess(Sender);
ShowMessage(P.ReturnStr);
end;
线程在终止时将返回
MID123BLA
。确定,然后从ontterminate
事件处理程序中获取它。一个是在主线程的上下文中调用的,因此它是安全的;OnThreadTerminate:字符串;然后结果:=MyReturnStr;不,您已经有了正确的版本(它必须与事件原型保持匹配)。只需在OnThreadTerminate
处理程序中以某种方式处理字符串(我不知道您想做什么)。在该方法中,访问主线程是安全的。我希望它返回表单。我应该创建一个Read吗?代码设计没有好处,但您甚至可以编写该事件处理程序作为表单的一部分。或者,另一个糟糕的做法是从当前处理程序访问预声明的全局表单变量。或者传递并存储对该线程的表单引用,并从线程字段访问它。谢谢,这就是我要找的。