multithreading - Delphi访问线程变量

标签 multithreading delphi variables

我有一个为我执行WMI查询的线程,在执行查询后,我需要访问该线程中的一些变量。

线程创建如下...

procedure TFormMain.RunThread;
var
  WMIQ: TThreadWmiQuery;
begin
  WMIQ := TThreadWmiQuery.Create(True);
  ...
  WMIQ.OnTerminate := WMIQThreadOnTerminate;
  WMIQ.Resume;
end;

在OnTerminate事件中,我得到了所需的值,就像这样……
procedure TFormMain.WMIQThreadOnTerminate(Sender: TObject);
begin
  Opcd := TThreadWmiQuery(Sender).P4COpcd;
  Role := TThreadWmiQuery(Sender).P4CRole;
  Usnm := TThreadWmiQuery(Sender).P4CUsnm;
end;

有人告诉我,这可能不是访问线程变量的最佳方法。还有没有其他更好的方法可以轻松地从线程中获取数据而又不增加太多复杂性?

问候,彼得

最佳答案

谁告诉你的?他们有什么理由吗?

OnTerminate在执行完毕之后且销毁之前可以查询线程实例。实际上,将TThread的FreeOnTerminate设置为True时,您没有其他地方可以访问线程的变量。

其他机制:

线程设置的

  • 全局变量,在其他地方查询:yuck,您仍然需要使用onterminate来知道线程何时完成。最好将变量保持在线程本身的本地。
  • 使用来自线程的PostThreadMessage的
  • :但是要发布到哪里?那意味着让线程知道向谁发布这些消息,从而知道某种观察者机制。

  • 首先我不推荐。如果您只需要在线程终止时查询几个值,第二个恕我直言是多余的。

    关于multithreading - Delphi访问线程变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3881794/

    相关文章:

    java - 以线程安全的方式更新ConcurrentHashMap

    c++ - 以成员函数启动线程

    delphi - 如何计算 DrawGrid 中的彩色单元格数量?

    c# - 如何在稍后使用的构造函数中创建一个数组

    javascript - 使用 `let` 重新声明变量会导致 “Uncaught SyntaxError: redeclaration of let …”

    c# - 如何通过相同的函数对我的代码进行多线程处理以同时处理多个文件?

    c++ - 使用 C++ 线程池库 (CTPL) 的异常错误

    delphi - 为什么当客户端连接到 Indy 中的服务器时 IOHandler.ReadStream 会阻塞线程?

    Delphi-Mocks:在构造函数中使用参数模拟类

    python - Tensorflow 中网络权重的线程安全克隆?