如何获取windows线程信息

tnfyj 2008-05-09 08:24:05
RT

在多线程的环境中,收集每个线程的开始时间,结束时间,内核模式花费的时间,用户模式花费的时间

已知函数 GetThreadTimes(HANDLE hThread,
LPFILEMTIME createTime,
LPFILEMTIME endTime,
LPFILEMTIME kernelTime,
LPFILEMTIME UserTime)

问题是这个函数应该放在哪呢?假设runMT()方法是线程开始时运行的函数,放在runMT中是不合适的,因为此时线程正在运行,无法预料自己的结束时间、内核模式的时间和用户模式的时间,放在runMT外面?可恨的这里是多线程的环境,在成百上千个线程将操作系统折磨的一塌糊涂的时候你怎么收集你指定的那个句柄的线程信息?可能它已经结束了,也可能还未开始执行。。。

救命啊。。。。我现在感觉我自己的脑子里面就好像有好多线程在运行。。。没有同步的。。。。

请各位伸出援助之手,敝人必将慷慨解囊。。。
...全文
456 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
小强提包包 2009-03-20
  • 打赏
  • 举报
回复
如果2楼3楼技术分能那么高,我真的有点不敢相信,你们得可用分为什么那么低?!1刷得嘛?!!!
tnfyj 2008-05-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 cnzdgs 的回复:]
在创建它的线程中,利用线程句柄来判断线程结束后再取。
[/Quote]线程都已经结束了 句柄存在?我不太清楚这个。。。一直以为线程结束了句柄就没有任何意义了。。。
tnfyj 2008-05-10
  • 打赏
  • 举报
回复
已成功~万分感谢。。。
cnzdgs 2008-05-10
  • 打赏
  • 举报
回复
或者在线程中做一个循环,循环中打开文件、写文件、关闭文件,只要循环次数够大,KernelTime和UserTime就都不是0了。
cnzdgs 2008-05-10
  • 打赏
  • 举报
回复
如果你的线程基本上没做什么,时间就都是0。你可以在线程中做一个循环,循环次数大一些,这样UserTime就不是0了。
tnfyj 2008-05-10
  • 打赏
  • 举报
回复

#include <windows.h>
#include <iostream>
using namespace std;

DWORD WINAPI run(LPVOID param){
cout<<"running at thread"<<endl;
Sleep(3000);
return 0;
}
void main(){

HANDLE hThread = CreateThread(NULL,0,run,NULL,CREATE_SUSPENDED,NULL);
ResumeThread(hThread);
WaitForSingleObject(hThread,INFINITE);

LPFILETIME lpftCreateTime=new FILETIME();
LPFILETIME lpftEndTime=new FILETIME();
LPFILETIME lpftKernelTime=new FILETIME();
LPFILETIME lpftUserTime=new FILETIME();

GetThreadTimes(hThread,lpftCreateTime,lpftEndTime,lpftKernelTime,lpftUserTime);

LPSYSTEMTIME lpstCreateTime = new SYSTEMTIME();
FileTimeToSystemTime(lpftCreateTime,lpstCreateTime);
cout<<"the Start time is: "
<<lpstCreateTime->wHour<<"时"
<<lpstCreateTime->wMinute<<"分"
<<lpstCreateTime->wSecond<<"秒"
<<lpstCreateTime->wMilliseconds
<<endl;

LPSYSTEMTIME lpstEndTime = new SYSTEMTIME();
FileTimeToSystemTime(lpftEndTime,lpstEndTime);
cout<<"the End time is: "
<<lpstEndTime->wHour<<"时"
<<lpstEndTime->wMinute<<"分"
<<lpstEndTime->wSecond<<"秒"
<<lpstEndTime->wMilliseconds
<<endl;

LPSYSTEMTIME lpstKernelTime = new SYSTEMTIME();
FileTimeToSystemTime(lpftKernelTime,lpstKernelTime);
cout<<"the Kernel time is: "
<<lpstKernelTime->wHour<<"时"
<<lpstKernelTime->wMinute<<"分"
<<lpstKernelTime->wSecond<<"秒"
<<lpstKernelTime->wMilliseconds
<<endl;

LPSYSTEMTIME lpstUserTime = new SYSTEMTIME();
FileTimeToSystemTime(lpftUserTime,lpstUserTime);
cout<<"the User time is: "
<<lpstUserTime->wHour<<"时"
<<lpstUserTime->wMinute<<"分"
<<lpstUserTime->wSecond<<"秒"
<<lpstUserTime->wMilliseconds
<<endl;

}

代码如上,为什么KernelTime和UserTime都是0时0分0秒呢???
tnfyj 2008-05-10
  • 打赏
  • 举报
回复
已经尝试。。。。 可以得到线程结束的时间了。。。
但是内核模式下的时间和用户模式下的时间为什么都是零呢???
cnzdgs 2008-05-09
  • 打赏
  • 举报
回复
在创建它的线程中,利用线程句柄来判断线程结束后再取。
jacklzw88 2008-05-09
  • 打赏
  • 举报
回复
线程是你自己启动的吗?
你新建的时候把线程句柄保存下来吗?
DWORD mythreadid;
HANDLE hThread =CreateThread(NULL,0,myThreadProc,NULL,0,&mythreadid);
if(WaitForSingleObject(hThread,INFINITE))

{
GetThreadTimes(hThread,createTime,endTime,kernelTime,UserTime);
}
KeSummer 2008-05-09
  • 打赏
  • 举报
回复
你想要那个线程的信息就传那个线程句柄..

15,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧