1


我的应用程序必须每隔几个 *microsec*s 暂停和恢复一个不同的进程。
它工作得很好,只是有时感觉它会暂停非统一时间的过程。
我使用 win API:ResumeThreadSuspendThread.

另一方面,我尝试了一些不同的东西。
我像往常一样暂停了线程,SuspendThread但是当我恢复它时,我确实喜欢这样:

while (ResumeThread(threadHandle) > 0);

它工作得更快,并且以统一的速度运行其他进程。
为什么会这样?是否有可能有时线程被挂起两次,然后执行 ResumeThread 命令?
谢谢 :)

4

3 回答 3

3

SuspendThread()call 不会立即挂起线程。保存执行上下文需要一些时间,因此ResumeThread()可能会在线程尚未挂起时调用。这就是为什么while (ResumeThread(threadHandle) > 0);有效。要确定当前线程状态,您可以调用NtQueryInformationThread(),但仅限于 NT 版本的 Windows。

如果辅助线程中有循环,则可以使用手动重置事件更改同步。主线程应该调用ResetEvent()以挂起线程并SetEvent()恢复。每个循环都应调用的辅助线程WaitForSingleObjectEx()

于 2011-04-19T19:17:27.550 回答
0

我遵循了 Damon 的建议,从代码中删除了暂停 / 恢复,而是使用了一个同步对象,我的池线程在完成工作后无限等待,并且在为它分配工作后,我的服务器线程发出同样的信号。

我现在唯一必须使用挂起的时间是当我第一次创建线程并为它分配工作后,线程从我的服务器线程恢复。创建的线程在线程池中一遍又一遍地用于做一些工作。

它就像一个魅力。

谢谢达蒙!

问候,

阿杰

于 2014-09-04T09:58:34.227 回答
0

这就是de loop的样子

for(i=0;i<num;i++) {     
  while (ResumeThread(threadHandle) > 0);
  ResumeThread(threadHandle)
  SuspendThread(threadHandle);      
}

SuspendThread需要几毫秒,所以 while 循环一直持续到线程被挂起,之后,再次调用线程处理SuspendThread函数,这是调用GetProcessContext查看 EIP的好方法

于 2017-02-13T22:32:41.943 回答