我有一个使用Visual Studio开发的C ++应用程序,它包含一个线程池,大多数时候大多数线程都处于休眠状态。如果我在调试时中断,比如说在模式对话框中,调试器中出现的线程上下文总是我的睡眠线程之一。有没有办法自动更改它以选择主进程线程而不是睡眠工作线程?这主要是当主线程没有坐在AfxInternalPumpMessage()所以我的主线程就在这里;
BOOL AFXAPI AfxInternalPumpMessage()
{
_AFX_THREAD_STATE *pState = AfxGetThreadState();
if (!::GetMessage(&(pState->m_msgCur), NULL, NULL, NULL)) <-----
{
#ifdef _DEBUG
TRACE(traceAppMsg, 1, "CWinThread::PumpMessage - Received WM_QUIT.\n");
pState->m_nDisablePumpCount++; // application must die
#endif
// Note: prevents calling message loop things in 'ExitInstance'
// will never be decremented
return FALSE;
}
而我的非活动线程池在这里;
if (pThreadInfo->m_pActivity)
{
SetThreadPriority(pThreadInfo->m_hThread, THREAD_PRIORITY_NORMAL);
pThreadInfo->m_pActivity->Execute();
SetThreadPriority(pThreadInfo->m_hThread, THREAD_PRIORITY_BELOW_NORMAL);
pThreadInfo->m_pActivity = NULL;
}
else
Sleep(50); <-----
虽然它不是一件大事,但它是一个恒定的浪费时间。我猜测逻辑是调试器比其他代码更喜欢用户代码。
答案 0 :(得分:1)
发生停止事件的线程是显示的线程。即使在Async-Break中也是如此(尽管这似乎是随机的,因为在这种情况下在所有线程上都设置了bps)。
基本上,它是这样做的:
1)暂停所有线程
2)在所有线程的ip上设置断点
3)当其中一个bps命中时,删除所有bps并将该线程显示为选中
4)如果没有命中bp(由于死锁),所有线程都被挂起并发送假停止事件(称为冻结异步中断)。在这种情况下,选择第一个线程。
你可能在当天写了一个宏来做这个,但今天,这需要一个插件或其他自动化客户端,因为我们已经没有宏了。