Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 从线程Delphi返回字符串_Multithreading_Delphi_Return Value_Delphi Xe6 - Fatal编程技术网

Multithreading 从线程Delphi返回字符串

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

我使用的是DelphiXe6

我有一个线程,在这里我传递了一个ID,并希望得到一个由该线程创建的字符串。我看了所有的例子,但它们都在线程运行时返回值,我只需要它在Terminate上

从窗体调用线程:

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吗?代码设计没有好处,但您甚至可以编写该事件处理程序作为表单的一部分。或者,另一个糟糕的做法是从当前处理程序访问预声明的全局表单变量。或者传递并存储对该线程的表单引用,并从线程字段访问它。谢谢,这就是我要找的。