我的程序,已经有了至少3个线程,每个线程都要求
周期性的处理一些任务,
对于每个线程,我都使用了这样的代码:
while(ture)
{
if(time_interval>T)
{ //some operation
}
}这样做可行吗?我每个线程实际占用了多少系统时间呢?
还有就是想问一下,大家都如何调试多线程程序呀?
谢谢
周期性的处理一些任务,
对于每个线程,我都使用了这样的代码:
while(ture)
{
if(time_interval>T)
{ //some operation
}
}这样做可行吗?我每个线程实际占用了多少系统时间呢?
还有就是想问一下,大家都如何调试多线程程序呀?
谢谢
#define WINVER 0x500#include <windows.h>
#include <tlhelp32.h>
#include <iostream>
//
//当在用户模式机内核模式下都提供所耗时间时,在内核模式下进行所耗时间的64位计算的帮助方法
//
DWORD GetKernelmodePercentage(const FILETIME& ftKernel,const FILETIME& ftUser)
{
//半FILETIME结构转化为64位整数
ULONGLONG qwKernel = (((ULONGLONG)ftKernel.dwHighDateTime) << 32 ) +
ftKernel.dwLowDateTime;
ULONGLONG qwUser = (((ULONGLONG)ftUser.dwHighDateTime) << 32 ) +
ftUser.dwLowDateTime; //将消耗时间相加,然后计算在内核模式下的时间百分比
ULONGLONG qwTotal = qwKernel + qwUser;
DWORD dwPct = (DWORD)(((ULONGLONG)100 * qwKernel) / qwTotal); return dwPct;
}//
//以下是将当前运行过程名和消耗在内核模式下的时间百分数都显示出来的就用程序
//
void main()
{
//对当前系统中运行的过程抓取“快照”
HANDLE hSnapshot = ::CreateToolhelp32Snapshot(
TH32CS_SNAPPROCESS, //提取当前过程
0); //如果是当前过程,就将其忽略 //初始化过程入口
PROCESSENTRY32 pe;
::ZeroMemory(&pe,sizeof(pe));
pe.dwSize = sizeof(pe); //按所有过程循环
BOOL bMore = ::Process32First(hSnapshot,&pe);
while(bMore)
{
//打开用于读取的过程
HANDLE hProcess = ::OpenProcess(
PROCESS_QUERY_INFORMATION, //指明要得到信息
FALSE, //不必继承这一句柄
pe.th32ProcessID); //要打开的过程
if(hProcess != NULL)
{
//找出过程的时间
FILETIME ftCreation,ftExit,ftKernelMode,ftUserMode;
::GetProcessTimes(
hProcess, //所感兴趣的过程
&ftCreation, //过程的启动时间(绝对的)
&ftExit, //结束时间(如果有的话)
&ftKernelMode, //在内核模式下消耗的时间
&ftUserMode); //在用户用户模式下消耗的时间
//计算内核模式消耗的时间百分比
DWORD dwPctKernel = ::GetKernelmodePercentage(
ftKernelMode,//在内核模式上消耗的时间
ftUserMode);//在用户模式下消耗的时间 //向用户显示过程的某些
std::cout<<"Process ID: " << pe.th32ProcessID
<<", EXE file:" << pe.szExeFile
<< ", % in kernel mode:" << dwPctKernel
<< std::endl; //消除句柄
::CloseHandle(hProcess);
} //转向下一个过程
bMore = ::Process32Next(hSnapshot,&pe);
}
}