Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何知道Windows CE下的线程是否挂起 在Windows CE下,可以使用C或Visual C++获得线程挂起计数,而不调用恢复或暂停函数?我能看到的唯一方法就是 int Count = SuspendThread(ThreadHandle); ResumeThread(ThreadHandle);_C++_C_Multithreading_Windows Mobile - Fatal编程技术网

如何知道Windows CE下的线程是否挂起 在Windows CE下,可以使用C或Visual C++获得线程挂起计数,而不调用恢复或暂停函数?我能看到的唯一方法就是 int Count = SuspendThread(ThreadHandle); ResumeThread(ThreadHandle);

如何知道Windows CE下的线程是否挂起 在Windows CE下,可以使用C或Visual C++获得线程挂起计数,而不调用恢复或暂停函数?我能看到的唯一方法就是 int Count = SuspendThread(ThreadHandle); ResumeThread(ThreadHandle);,c++,c,multithreading,windows-mobile,C++,C,Multithreading,Windows Mobile,这有两个问题,首先,我不希望挂起线程,其次,如果线程运行内核代码,挂起可能会失败。我可以解决这个问题,但我觉得应该有一个更优雅的解决方案。我还可以使用 int Count = ResumeThread(ThreadHandle); SuspendThread(ThreadHandle); 但这也有类似的问题。从句柄中获取挂起计数的任何好的替代方法?可能与您一起,您可以检查线程是否挂起,但无法检索挂起计数器。我有一个组合解决方案。使用WaitForSingleObject()确定线程是否挂起

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

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

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

可能与您一起,您可以检查线程是否挂起,但无法检索挂起计数器。

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

如果未挂起,则挂起计数显然为0


如果它已挂起,则可以安全地调用SuspendThread()以获取挂起计数。由于它已经挂起,您将不会暂停任何操作。

即使处于活动状态的线程,您仍将收到等待超时结果,这是因为线程仅在完成时发出信号,而不是在运行时发出信号


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

您不应该在任何平台上挂起任何线程。

相反,您应该在线程代码中添加同步点,该同步点显式地等待标志发出信号,然后才允许继续。通过这种方式,您知道将在哪里暂停,或者至少知道将在安全点暂停

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

  • 暂停
  • 恢复(因为如果无法挂起线程,则不需要它)
  • 终止/中止
你永远不应该把你的意志从外部强加于一根线上。您无法保证它正在做什么,它当前锁定了什么类型的资源


始终以协作模式编写线程。你的线程应该意识到它周围的环境,并服从外部世界的意愿,要么有序退出,要么暂停直到它可以安全地继续。

是的,这是唯一的方法。有趣的答案。等待多长时间,1ms是否在所有情况下都足够,或者它可能会变慢?实际上,我认为您可以使用等待时间0。WaitForSingleObject()将测试状态并立即返回。您只对检查WAIT\u对象\u 0的返回值感兴趣。这将告诉您线程状态是有信号的,因此没有挂起。只需检查它,工作正常,谢谢。祝你周末愉快。这就是为什么建议的等待是0,而不是无限。同样,在等待中使用无限也永远不会发生。我完全同意,等待发生是一种挂起状态。+1,经过大量繁琐的调试,我最终删除了所有挂起/恢复调用,以及将所有同步对象减少为与所讨论的两个线程之间的通信堆栈使用相关联的单个互斥体。