1. 程式人生 > >GetThreadTimes獲取其它執行緒cpu時間

GetThreadTimes獲取其它執行緒cpu時間

http://www.cnblogs.com/eaglet/archive/2009/03/11/1408809.html

鄙視下上面的垃圾博文,純粹忽悠人

參考文章: http://blog.kalmbachnet.de/?postid=28 這是一個德國人寫的部落格,我看了好幾遍,對他寫的德式英語還是不太明白,(本人英文水平不高也是事實),所以我理解的不對的地方還望大家指正。不過結論肯定是正確的,就是通過GetThreadTimes 得到的執行緒佔用時間是不準確的,在某種條件下甚至是很不準確的。 另外我發現呼叫GetThreadTimes獲取其它執行緒的計數基本得不到,我還沒有搞明白是什麼原因。

搞不明白不去看官方文件!!!!!!!!!!!!

檢視msdn 裡GetThreadTimes的文件http://msdn.microsoft.com/en-us/library/windows/desktop/ms683237(v=vs.85).aspx 

BOOL WINAPI GetThreadTimes(
  _In_   HANDLE hThread,//需要獲取cpu時間的執行緒控制代碼
  _Out_  LPFILETIME lpCreationTime,//建立時間
  _Out_  LPFILETIME lpExitTime,//退出時間
  _Out_  LPFILETIME lpKernelTime,//核心時間
  _Out_  LPFILETIME lpUserTime//使用者時間
);
hThread其計時資訊尋求的執行緒的控制代碼。該控制代碼必須具有的 THREAD_QUERY_INFORMATION 或 THREAD_QUERY_LIMITED_INFORMATION 訪問權。有關詳細資訊,請參見執行緒安全和訪問許可權。Windows Server 2003 和 Windows XP: 控制代碼必須具有的 THREAD_QUERY_INFORMATION 的訪問許可權。在這篇文章
Thread Security and Access Rightshttp://msdn.microsoft.com/en-us/library/windows/desktop/ms686769(v=vs.85).aspx
裡看到THREAD_QUERY_INFORMATION,結合說明得出THREAD_QUERY_INFORMATION是安全描述符的一個標誌,所以又檢視下面這篇文章學習如果建立使用
Creating a Security Descriptor for a New Object in C++ http://msdn.microsoft.com/zh-cn/library/aa446595.aspx
 
FILETIME ftKernelTimeStart, ftKernelTimeEnd;
	FILETIME ftUserTimeStart, ftUserTimeEnd;
	FILETIME ftDummy;

	HANDLE hThread;
	unsigned threadID;

	SECURITY_ATTRIBUTES saThread; 
	PSECURITY_DESCRIPTOR pSD = NULL; //PSECURITY_DESCRIPTOR安全描述符
	pSD = (PSECURITY_DESCRIPTOR)LocalAlloc(LPTR,
		THREAD_QUERY_INFORMATION);
	if (NULL == pSD)
	{
		_tprintf(_T("LocalAlloc Error %u\n"), GetLastError());
	}

	saThread.nLength = sizeof(saThread);
	saThread.lpSecurityDescriptor = pSD;

	hThread = (HANDLE)_beginthreadex(&saThread, 0, FirstThread, NULL, 0, &threadID);

	if(pSD)
		LocalFree(pSD);
	GetThreadTimes(hThread, &ftDummy, &ftDummy,
		&ftKernelTimeStart, &ftUserTimeStart);