从Thread Delphi返回字符串

时间:2017-09-16 19:23:49

标签: multithreading delphi return-value delphi-xe6

我正在使用Delphi XE6。

我有一个线程,我传递一个ID,并希望找回该线程创建的字符串。我查看了所有示例,但是当线程运行时它们都返回值我只需要OnTerminate。

从表单调用线程:

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;

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

您需要拦截线程终止。一种方法是使用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