永发信息网

Thread详解3:线程的状态及几个简单方法

答案:1  悬赏:40  手机版
解决时间 2021-04-02 14:28
Thread详解3:线程的状态及几个简单方法
最佳答案
获得线程的状态的方法
如果是在windows NT下,可以用pdh接口。platform SDK里有pdh.h和pdh.lib,把他们加到项目里来。
下面的代码是我的一个程序的片断:
比如你要查看explorer.exe的第一个线程的状态,可以这样用(当然,你自己要做一些修改):
[cpp] view plaincopy
void func()  
{  
Initialize();  
LONG rt = GetThreadState(_T("explorer/0"));  
switch(rt)  
{  
case 0: //Initialized, The thread is recognized as an object by the microkernel.  
break;  
case 1: //Ready,The thread is prepared to run on the next free processor.  
break;  
case 2: //Running, The thread is executing.  
break;  
case 3: //Standby, The thread is assigned to a processor and about to run. Only one thread can be in Standby state at a time.  
break;  
case 4: //Terminated, The thread is finished executing.  
break;  
case 5: //Waiting, The thread is not ready for the processor. When it is ready, it will have to be rescheduled.  
break;  
case 6: //Transition, The thread is ready but waiting for resources other than the processor to become available.  
break;  
case 7: //unknown, The thread state is unknown.  
break;  
default:  
break;  
}  
}  
BOOL CPdhWrapper::Initialize()  
{  
typedef long (__stdcall *PDHOpenQuery) (LPCSTR, DWORD_PTR, HQUERY);  
PDHOpenQuery pfnPdhOpenQuery;  
m_hPdhModule = LoadLibrary(_T("PDH.DLL"));  
if(m_hPdhModule == NULL)  
return FALSE;  
// 这个地方ms弄错了,pdh.h里声明的是PdhOpenQueryA,但pdh.dll里导出的却是PdhOpenQuery。  
pfnPdhOpenQuery = (PDHOpenQuery)GetProcAddress(m_hPdhModule, "PdhOpenQuery");  
if(pfnPdhOpenQuery == NULL)  
return FALSE;  
return ERROR_SUCCESS == pfnPdhOpenQuery(NULL, 1, &m_hQuery);  
}  
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);  
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
oppo r7c电信版能用移动卡吗
在青岛想淘便宜又质量好的生活用品,去哪个市
脖套和围脖哪个更好看一些
cad怎么出道路平面图?
发票抬头为个人,可以报销吗
在VF里怎么用命令的方式取整?
厘米秀的形象保存突然不能用怎么办
康佳二十九寸彩电图像下部拉丝是什么原因
下列有关遗传的说法,正确的是(  )①摩尔
商场里玉器打一折是真的A货吗
永恒纪元戒手游小米版
无刷电机怎么更换霍尔,及注意事项
求几道商法题目的答案,急!在线等!
BT5U盘版启动不了,提示输入管理员密码,按es
我没有找到excel mac的设置选项-“重新计算"
推荐资讯
发财树叶子尖焦黄是什么原因。
自家用买什么车实用
怎么看一块地的风水?
3分之二时=()分,20克=()千克8分之五日=()时?
问道装备已经打孔了还能使用镶嚷令吗
阿莎为什么和郑中基离婚
led和太阳能庭院灯各自的优缺点
什么叫保单承保日
日本电源火线在左边还是右边?
煎猪扒的做法,煎猪扒怎么做好吃,煎猪扒的家
手指舍利是在那个朝代的
如图,已知:AB⊥BF,EF⊥BF,AC=ED,BD=FC,
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?