我有一个在VS2014 SP2下运行的本机C++应用程序,它使用我自己的线程池类使用了大量多线程。通常,应用程序在任何时候都会有>32个线程在运行,其中大多数线程在大部分时间都处于空闲状态。调试器是否有任何方法可以查看线程视图中的哪些线程处于空闲状态(即处于睡眠函数中),就像目前一样,如果我中断执行,调试器通常会将我带回非活动线程的睡眠部分;
UINT _cdecl MyThreadFunc(LPVOID pParam)
{
CMyThreadSlot *pThreadInfo = (CMyThreadSlot*)pParam;
while (pThreadInfo->m_pManager->m_Active)
{
try
{
if (pThreadInfo->m_pActivity)
{
pThreadInfo->m_pActivity->Execute();
pThreadInfo->m_pActivity = NULL;
}
else
Sleep(50); <-- breaking execution ends up here
}
catch (CUserException* e)
{
e->Delete();
if (pThreadInfo->m_pActivity)
if (pThreadInfo->m_pActivity->m_pThreadGroup)
pThreadInfo->m_pActivity->m_pThreadGroup->m_ExceptionThrown = TRUE;
}
}
return CMyThreadManager::ExitOk;
}
如果我在中断后到达这里,我目前必须在每个线程的调用堆栈中搜索,看看实际执行的是什么,这可能会很痛苦。即使我打断了其他代码,我仍然想知道哪些其他线程没有休眠,并检查它们在做什么。
编辑:好的,这是一个足够笨拙的解决方案,但启动Process Explorer,右键单击我正在运行的应用程序,选择属性线程可以让我根据CPU使用情况对线程进行排序,使用活动线程的线程ID,然后让我找出正在使用的线程。主要缺陷是必须在破坏正在运行的应用程序之前完成此操作。
想明白了。诀窍是初始化优先级低于正常值的线程,在运行时将其设置为正常值,然后重置为低于正常值。在调试器的线程视图中,按优先级排序会为您提供活动线程。所以从前面的代码来看,线程被初始化为
CWinThread *pWinThread = AfxBeginThread(MyThreadFunc, MyThreadSlotObject, THREAD_PRIORITY_BELOW_NORMAL);
MyThreadSlotObject->m_hThread = pWinThread->m_hThread;
以及修订如下的先前法规;
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;
}
编辑:如果你不想更改优先级,看起来你也可以通过线程命名轻松地完成。