关于线程,COM +和STA公寓的几个问题

时间:2011-03-13 09:51:07

标签: multithreading delphi com+ sta

我有一个Windows服务,可以创建10个线程+创建任务列表的线程。

这11个线程中的每一个都通过调用CoInitialize(nil)进入STA。

  1. 任务列表由一个线程创建,其他获取项目,处理它并免费....
  2. a)其他线程可以使用其他线程创建的对象吗? (这似乎工作,但..) b)其他线程可以释放另一个线程分配的内存吗? (这似乎不起作用......)

    我应该以某种方式封送线程之间的指针吗? 或者我应该至少获得该项目,处理它,但让它被释放是创建它的线程的“所有者”?

    1. 在我的Windows服务中,我创建了可用于启动/停止服务的功能(疑似并恢复线程)。
    2. 但是我遇到了实际收集数据并在间隔中执行的线程的问题。 当线程加载要处理的项目时,在它之后,它进入睡眠状态5分钟。 我怎样才能安全地终止这样的线程?如何中止睡眠状态?

      提前感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

要在STA线程之间编组STA对象指针,请使用CoMarshallInterThreadInterfaceInStreamCoGetInterfaceAndReleaseStream

STA线程必须使用Windows消息来泵送消息,因为这是STA线程使用COM的方式。即你必须调用GetMessage / TranslateMessage / DispatchMessage。可能您的框架有一个简单的消息泵功能,您可以使用它来执行此操作。

要中止5分钟的睡眠状态,请在较短的时间间隔内进行多次睡眠,并检查“shouldquit”标志。在Service Main中设置shouldquit标志。

答案 1 :(得分:2)

您可能需要跨线程编组接口。 Here您可以找到一个C ++示例,相同的文章显示了您可以使用的三种技术(oMarshalInterThreadInterfaceInStream / CoMarshalInterface / Global Interface Table(GIT))。有关它们的更多信息,请参阅MSDN。

要让线程等待但能够在休眠结束之前终止它,请使用具有正确超时值的WaitForSingleObject(),例如等待的Windows事件。当函数退出时,它会告诉它是否已退出,因为已超时或事件已设置。要在达到超时之前退出等待功能,请设置事件。因此,您可以选择是否输入另一个等待循环或退出。