【问题标题】:Delphi thread return valueDelphi线程返回值
【发布时间】:2014-06-19 12:12:55
【问题描述】:

有人可以解释一下我是如何从 myThread 调用函数测试中获取返回值的吗?

function test(value: Integer): Integer;
begin
  Result := value+2;    
end;

procedure myThread.Execute;
begin
  inherited;
  test(Self.fParameters);
end;

procedure getvaluefromthread();
var
  Capture : myThread;
begin
  list := TStringList.Create;
  Capture := myThread.Create(False);
  Capture.fParameters := 2;
  Capture.Resume;
end;

【问题讨论】:

  • 应该避免恢复/启动,没有必要创建暂停的线程。非创建挂起线程的实际启动是在 AfterConstruction 中完成的,它在所有构造函数都被调用后调用。
  • test() 中缺少一个:=,更不用说缺少begin
  • 如果您真的是 Delphi 新手,也许线程不是您应该开始学习的地方。

标签: multithreading delphi return-value


【解决方案1】:
  1. 声明一个派生自TThread 的类。
  2. 添加一个或多个字段以包含结果值。
  3. 在覆盖的Execute 方法中设置结果值字段。
  4. 当线程完成后,从线程实例中读取结果。

正如 Remy 所指出的,如果您只想返回一个 Integer 值,那么您可以使用 TThreadReturnValue 属性。以与上述相同的方式使用它。请注意,ReturnValue 中的值是底层 OS 线程返回的值。

您可以收听OnTerminate 以了解线程何时完成。或致电WaitFor

请注意,您在线程开始运行后设置线程的参数。要么创建挂起的线程,要么将参数传递给构造函数。此外,您应该使用Start 而不是Resume。后者已弃用。

【讨论】:

  • TThread 有一个ReturnValue 属性。
  • @RemyLebeau 你当然可以使用它。这就是底层操作系统线程将返回的值。适用于 32 位整数。如果你想要更多,那么你需要建立它。
  • TThread.ReturnValue 不返回底层 OS 线程的结果代码,但可用于分配结果代码。用户可以在Execute() 中分配他们想要的任何东西给ReturnValue,并且它将在Execute() 退出后返回给操作系统。但是ReturnValueTThread的属性,所以可以在OnTerminate事件中读取,也可以作为TThread.WaitFor()的返回值。
  • 我不是不同意你,只是你的措辞。您听起来好像ReturnValue 从操作系统接收线程的结果代码,但事实并非如此。它设置了返回给操作系统的结果代码。就这些。相同的想法,不同的语义。
  • @forsajt 否,因为对象仍在执行方法
猜你喜欢
  • 2018-02-25
  • 1970-01-01
  • 2013-11-06
  • 2012-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多