1

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

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

  1. 任务列表由一个线程创建,另一个线程获取项目,处理它并释放....

a) 其他线程可以使用其他线程创建的对象吗?(这似乎可行,但是..) b)另一个线程可以释放另一个线程分配的内存吗?(这似乎不起作用......)

我应该以某种方式编组线程之间的指针吗?或者我是否应该至少获得该项目,对其进行处理,但让它成为创建它的线程的“所有者”?

  1. 在我的 Windows 服务中,我创建了可用于启动/停止服务(暂停和恢复线程)的功能。

但是,我对实际收集数据并在间隔内执行的线程有疑问。当线程加载要处理的项目后,它进入睡眠状态 5 分钟。我怎样才能安全地终止这样的线程?如何中止睡眠状态?

在此先感谢您的帮助!

4

2 回答 2

2

要在 STA 线程之间编组 STA 对象指针,请使用CoMarshallInterThreadInterfaceInStream, 和CoGetInterfaceAndReleaseStream.

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

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

于 2011-03-13T10:22:05.310 回答
2

您可能必须跨线程编组接口。在这里您可以找到一个 C++ 示例,同一篇文章展示了您可以使用的三种技术(oMarshalInterThreadInterfaceInStream/CoMarshalInterface/Global Interface Table(GIT))。有关它们的更多信息,您可以在 MSDN 中找到。

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

于 2011-03-13T11:53:05.067 回答