我有一个Windows服务,可以创建10个线程+创建任务列表的线程。
这11个线程中的每一个都通过调用CoInitialize(nil)进入STA。
a)其他线程可以使用其他线程创建的对象吗? (这似乎工作,但..) b)其他线程可以释放另一个线程分配的内存吗? (这似乎不起作用......)
我应该以某种方式封送线程之间的指针吗? 或者我应该至少获得该项目,处理它,但让它被释放是创建它的线程的“所有者”?
但是我遇到了实际收集数据并在间隔中执行的线程的问题。 当线程加载要处理的项目时,在它之后,它进入睡眠状态5分钟。 我怎样才能安全地终止这样的线程?如何中止睡眠状态?
提前感谢您的帮助!
答案 0 :(得分:2)
要在STA线程之间编组STA对象指针,请使用CoMarshallInterThreadInterfaceInStream
和CoGetInterfaceAndReleaseStream
。
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事件。当函数退出时,它会告诉它是否已退出,因为已超时或事件已设置。要在达到超时之前退出等待功能,请设置事件。因此,您可以选择是否输入另一个等待循环或退出。