我如何知道线程是否在Windows CE下暂停

时间:2009-05-22 12:32:00

标签: c++ c multithreading windows-mobile

我可以使用C或Visual C ++在Windows CE下获取线程挂起计数,而无需调用resume或suspend函数吗?我能看到的唯一方法就是

int Count = SuspendThread(ThreadHandle);  
ResumeThread(ThreadHandle);

这有几个问题,首先,我宁愿不挂起线程,其次,如果线程正在运行内核代码,挂起可能会失败。我可以解决这个问题,但我觉得应该有更优雅的解决方案。我也可以使用

来反转它
int Count = ResumeThread(ThreadHandle);
SuspendThread(ThreadHandle);  

但是这有类似的问题。从句柄获取挂起计数的任何好的替代方法?

4 个答案:

答案 0 :(得分:4)

我有一个综合解决方案。使用WaitForSingleObject()来确定线程是否被挂起。

如果没有暂停,暂停计数显然为0.

如果它被挂起,可以安全地调用SuspendThread()来获取挂起计数。由于它已经暂停,你不会拖延任何东西。

答案 1 :(得分:1)

您不应该在任何平台上暂停任何线程。

您应该在线程代码中添加明确等待标志在允许继续之前发出信号的同步点。通过这种方式,您知道它将暂停的位置,或者至少知道它将在安全点暂停。

对于任何程序员,应该从任何平台上彻底禁止对线程的以下操作:

  • 挂起
  • 恢复(因为如果你不能暂停线程,你不需要它)
  • 杀死/中止

你永远不应该强行将你的意志强加于外线。您无法保证它正在做什么,它目前锁定的是哪种资源。

始终以合作模式编写线程。你的线程应该意识到它的周围环境,并让外界的愿望有条不紊地退出,或者暂停直到它能够安全地继续下去。

答案 2 :(得分:0)

可能使用WaitForSingleObject,您可以检查线程是否已暂停,但无法检索暂停计数器。

答案 3 :(得分:0)

即使是活动中的线程,你仍然会收到一个WAIT_TIMEOUT结果,这是因为线程仅在完成时发出信号,而不是在它们运行时发出信号。

说WaitForSingleObject(hThread,INFINITE)等待线程完成。