在c ++中暂停和恢复线程

时间:2011-04-19 17:31:52

标签: c++ windows resume suspend


我的申请必须每隔几个* microsec * s暂停和恢复一个不同的过程 它工作得很好,有时感觉它会暂停非制服时间的过程 我使用win API:ResumeThreadSuspendThread

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

while (ResumeThread(threadHandle) > 0);

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

我遵循了Damon的建议,从代码中删除了suspend / resume,而是使用了一个同步对象,我的池线程在完成工作后无限期地等待,我的服务器线程在分配工作后发出相同的信号。

我现在唯一需要使用suspend的时候是第一次创建线程,在分配工作之后,线程从我的服务器线程恢复。创建的线程反复用于线程池中以完成一些工作。

它的工作就像一个魅力。

谢谢Damon!

此致

的Ajay

答案 2 :(得分:0)

这就像de loop看起来的样式

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

SuspendThread需要几毫秒,因此while循环继续,直到线程被挂起,之后,再次调用线程进程SuspendThread函数,这是调用GetProcessContext到见EIP