德尔福访问线程变量

问题描述:

我有一个线程,为我做一个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; 

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

问候,彼得

+0

更好的是什么意思? – himself 2010-10-07 12:53:29

+0

在'正确的方式'中做得更好。然而,我从目前的答案中看到,我目前使用的方法没有任何问题。谢谢你所有的答案。问候,彼得。 – 2010-10-07 15:12:21

谁告诉你的?他们有任何理由吗?

OnTerminate在执行完成之后和销毁之前查询线程实例。事实上,当您将TThread的FreeOnTerminate设置为True时,您无法访问线程的变量。

其他机制:

  • 全局变量由线程设置,查询其他地方:呸,你仍然需要使用onterminate当线程完成就知道了。最好保留线程本身的局部变量。

  • 从线程使用PostThreadMessage:但要发布到哪里?这意味着让线程知道发布这些消息的人是谁,因此也是某种观察者机制。

第一个我不推荐。如果你只是需要在线程终止时查询一些值,那么第二个恕我直言是过分的。

我看到这种方法没有问题。

您存储对线程对象的引用的唯一地方是在局部变量中,所以线程对象在运行时不可访问。那很好;这意味着在线程完成计算它们的值之前,什么都不能访问线程的公共属性或字段。

确保你释放线程对象的某个地方。你可以通过在其构造函数中设置FreeOnTerminate属性来实现。

+0

谢谢。我总是在线程的构造函数中设置FreeOnTerminate。 P. – 2010-10-07 15:13:36

我看不出你的代码有什么问题,哪里不需要改进。但是如果你仍然想改进它,请注意TThread.OnTerminate代码是在主线程的上下文中使用TThread.Syncronize执行的。这意味着你的WMIQThread进入一个等待状态,休眠直到主线程执行TThread.OnTerminate代码,唤醒并终止。对于只分配线程变量不需要这种同步,所以可以改进代码,但是改进应该在TThreadWmiQuery方法中实现。

如果您不想更改TThreadWmiQuery实现,请将事情保持原样。