我的申请必须每隔几个* microsec * s暂停和恢复一个不同的过程
它工作得很好,有时感觉它会暂停非制服时间的过程
我使用win API:ResumeThread
和SuspendThread
。
另一方面,我尝试了一些不同的东西
我像往常一样用SuspendThread
暂停线程但是当我恢复它时,我确实喜欢这样:
while (ResumeThread(threadHandle) > 0);
它运行得更快,并以统一的速度运行其他过程
为什么会这样?是否有可能有时线程被挂起两次然后ResumeThread命令执行?
谢谢:)
答案 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