本帖最后由 halley62373 于 2010-03-04 16:07:57 编辑

解决方案 »

  1.   

    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暂停线程。
      

  2.   

    这个问题应该怎样说呢!CPU是一直运行的,你要取线程对CPU的利用率,那只能是取得一段CPU运行的时间,看在这个时间内线程运行的时间,之后再相除,就是该线程在某段时间段内对CPU的利用率。具体可以用如下方法。1、 在你进程启动时用GetTickCount能取得CPU开始的时间,再在一个合适的时机找一个结束的时间还用GetTickCount,用这两个时间相减就得出来了一个时间段。
    2、 用GetThreadTimes得到该线程在这段时间对CPU的使用时间,这个API返回四个参数,第一个参数是线程开始使用CPU时间,第二个参数是线程最后使用CPU时间,其它两个不用。用后一个减前一个就可以。
    3、 之后就按上面说的方法。
      

  3.   

    2楼的我能看懂一些。1楼的可以解释一下吗?我看不懂。我的目的只是为了防止CPU占用过高。希望当某个线程占用过高的时候,可以悬挂它一下。用什么方法可以知道某个线程突然占用很高的CPU呢? 只能统计所有的线程的CPU占有率吗?
      

  4.   

    还真得请教一下一楼,我理解线程占用CPU的利用率就是,在一段CPU时间内,该线程占用了多少CPU时间,再做相除。还真不知道有什么更好的办法。希望一楼把你的代码解释一下,帮人帮到底,谢谢!
      

  5.   

    楼主我给你留个mail吧我上班时不能上QQ而且在家里也不长上,我现在还在加班。
    我的mail:[email protected]欢迎你能和我一起研究问题。