怎么统计线程的CPU占有率? 本帖最后由 halley62373 于 2010-03-04 16:07:57 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 1、获得线程利用率,使用PDH计数器即可。LONG CPdhWrapper::QueryData(LPCTSTR lpCounterName) { HCOUNTER hCounter; PDH_FMT_COUNTERVALUE pdhFormattedValue; if(ERROR_SUCCESS != PdhAddCounter(m_hQuery, lpCounterName, NULL, &hCounter)) return -1; if(ERROR_SUCCESS != PdhCollectQueryData(m_hQuery) || ERROR_SUCCESS != PdhGetFormattedCounterValue( hCounter, PDH_FMT_LONG, NULL, &pdhFormattedValue ) || ERROR_SUCCESS != pdhFormattedValue.CStatus) { pdhFormattedValue.longValue = -1; } PdhRemoveCounter(hCounter); return pdhFormattedValue.longValue; } DWORD CPdhWrapper::GetThreadStat(LPCTSTR szThreadName) { TCHAR szCounterName[256]; _stprintf(szCounterName, _T("\\Thread(%s)\\Thread State"),szThreadName); return QueryData(szCounterName); } 2、SuspendThread暂停线程。 这个问题应该怎样说呢!CPU是一直运行的,你要取线程对CPU的利用率,那只能是取得一段CPU运行的时间,看在这个时间内线程运行的时间,之后再相除,就是该线程在某段时间段内对CPU的利用率。具体可以用如下方法。1、 在你进程启动时用GetTickCount能取得CPU开始的时间,再在一个合适的时机找一个结束的时间还用GetTickCount,用这两个时间相减就得出来了一个时间段。2、 用GetThreadTimes得到该线程在这段时间对CPU的使用时间,这个API返回四个参数,第一个参数是线程开始使用CPU时间,第二个参数是线程最后使用CPU时间,其它两个不用。用后一个减前一个就可以。3、 之后就按上面说的方法。 2楼的我能看懂一些。1楼的可以解释一下吗?我看不懂。我的目的只是为了防止CPU占用过高。希望当某个线程占用过高的时候,可以悬挂它一下。用什么方法可以知道某个线程突然占用很高的CPU呢? 只能统计所有的线程的CPU占有率吗? 还真得请教一下一楼,我理解线程占用CPU的利用率就是,在一段CPU时间内,该线程占用了多少CPU时间,再做相除。还真不知道有什么更好的办法。希望一楼把你的代码解释一下,帮人帮到底,谢谢! 楼主我给你留个mail吧我上班时不能上QQ而且在家里也不长上,我现在还在加班。我的mail:[email protected]欢迎你能和我一起研究问题。 使用VC开发窗口问题请教 VC打印问题,大家帮帮 树型控件问题 急啊,这么简单的问题:为什么创建SOCKET函数的返回值始终为0呢 如何获得Combo Box内的字符? 用这个CTypedPtrMap 老是内存外泄,不知道这个函数怎么回事? 急 进程间有哪些通信方式? 关于参数的传递 关于OLE剪贴板的基础问题。 VC ado 远程连接SQL 2000 数据库的问题 ? 怪事,天大的怪事。- VS2005 按钮消息响应。 鼠标如果在窗体外单击,那么窗体能接收到“鼠标在窗体外单击”这个消息么?
{
HCOUNTER hCounter;
PDH_FMT_COUNTERVALUE pdhFormattedValue;
if(ERROR_SUCCESS != PdhAddCounter(m_hQuery, lpCounterName, NULL, &hCounter))
return -1;
if(ERROR_SUCCESS != PdhCollectQueryData(m_hQuery)
|| ERROR_SUCCESS != PdhGetFormattedCounterValue(
hCounter,
PDH_FMT_LONG,
NULL,
&pdhFormattedValue )
|| ERROR_SUCCESS != pdhFormattedValue.CStatus)
{
pdhFormattedValue.longValue = -1;
}
PdhRemoveCounter(hCounter);
return pdhFormattedValue.longValue;
}
DWORD CPdhWrapper::GetThreadStat(LPCTSTR szThreadName)
{
TCHAR szCounterName[256];
_stprintf(szCounterName, _T("\\Thread(%s)\\Thread State"),szThreadName);
return QueryData(szCounterName);
}
2、SuspendThread暂停线程。
2、 用GetThreadTimes得到该线程在这段时间对CPU的使用时间,这个API返回四个参数,第一个参数是线程开始使用CPU时间,第二个参数是线程最后使用CPU时间,其它两个不用。用后一个减前一个就可以。
3、 之后就按上面说的方法。
我的mail:[email protected]欢迎你能和我一起研究问题。