https://github.com/gongluck/Windows-Core-Program.gitc++
//第7章 線程調度、優先級和關聯性.cpp: 定義應用程序的入口點。 // #include "stdafx.h" #include "第7章 線程調度、優先級和關聯性.h" //線程函數 DWORD WINAPI ThreadProc(PVOID param) { return 0; } int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { //線程的掛起和恢復 HANDLE hthread = CreateThread(nullptr, 0, ThreadProc, nullptr, CREATE_SUSPENDED, nullptr); DWORD suspendcount = SuspendThread(hthread);//返回線程的前一個掛起計數 suspendcount = ResumeThread(hthread);//返回線程的前一個掛起計數 BOOL bret = SwitchToThread();//當前線程放棄調度,返回是否有其餘可調度線程(低優先級的飢餓線程也會調度) Sleep(0);//當前線程放棄調度,可是低優先級的飢餓線程不會調度 FILETIME c, e, k, u; bret = GetThreadTimes(hthread, &c, &e, &k, &u);//獲取線程時間 //(更)精確的時間計算 LARGE_INTEGER start, end; bret = QueryPerformanceCounter(&start);//時鐘次數 LARGE_INTEGER frequency; bret = QueryPerformanceFrequency(&frequency);//時鐘頻率 bret = QueryPerformanceCounter(&end); double time = (double)(end.QuadPart - start.QuadPart) / (double)frequency.QuadPart; //黑科技GetThreadContext、SetThreadContext //進程優先級 STARTUPINFO si = { 0 }; si.cb = sizeof(si); PROCESS_INFORMATION pi = { 0 }; bret = CreateProcess(TEXT("C:\\WINDOWS\\SYSTEM32\\NOTEPAD.EXE"), nullptr, nullptr, nullptr, FALSE, CREATE_SUSPENDED|NORMAL_PRIORITY_CLASS, nullptr, nullptr, &si, &pi); bret = SetPriorityClass(pi.hProcess, BELOW_NORMAL_PRIORITY_CLASS);//修改進程優先級 DWORD priority = GetPriorityClass(pi.hProcess); //線程優先級 bret = SetThreadPriority(pi.hThread, THREAD_PRIORITY_BELOW_NORMAL); priority = GetThreadPriority(pi.hThread); //禁止系統自動的優先級提高 BOOL bPriority; bret = SetProcessPriorityBoost(pi.hProcess, FALSE); bret = GetProcessPriorityBoost(pi.hProcess, &bPriority); bret = SetThreadPriorityBoost(pi.hThread, FALSE); bret = GetThreadPriorityBoost(pi.hThread, &bPriority); CloseHandle(pi.hProcess); pi.hProcess = nullptr; CloseHandle(pi.hThread); pi.hThread = nullptr; //調度IO請求優先級 bret = SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_BEGIN);//下降線程調度優先級,不容許改變另外一個線程的IO優先級 /*IO操做*/ bret = SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_END);//讓線程進程normal級別的調度級別,不容許改變另外一個線程的IO優先級 //設置進程下全部進程的IO請求優先級 bret = SetPriorityClass(GetCurrentProcess(), PROCESS_MODE_BACKGROUND_BEGIN); bret = SetPriorityClass(GetCurrentProcess(), PROCESS_MODE_BACKGROUND_END); //單獨設置文件IO優先級 HANDLE hFile = CreateFile(TEXT("C:\\gongluck"), 0, 0, NULL, CREATE_NEW, 0, NULL); DWORD err = GetLastError(); FILE_IO_PRIORITY_HINT_INFO phi; phi.PriorityHint = IoPriorityHintLow; bret = SetFileInformationByHandle(hFile, FileIoPriorityHintInfo, &phi, sizeof(phi)); err = GetLastError(); CloseHandle(hFile); hFile = nullptr; //進程和CPU關聯性 DWORD processmask = 0; DWORD systemmask = 0; bret = GetProcessAffinityMask(GetCurrentProcess(), &processmask, &systemmask); bret = SetProcessAffinityMask(GetCurrentProcess(), processmask); bret = GetProcessAffinityMask(GetCurrentProcess(), &processmask, &systemmask); //線程和CPU關聯性 DWORD oldmask = SetThreadAffinityMask(hthread, 0x00000001);//限制只能在CPU0上運行 DWORD oldidea = SetThreadIdealProcessor(hthread, MAXIMUM_PROCESSORS);//設置理想CPU CloseHandle(hthread); hthread = nullptr; system("pause"); return 0; }