不知道你们做程序时,是不是希望有时候线程运行时不易被系统调度打断。
我最近发现Windows其实也能像Linux那样实现对进线程的控制。
在Windows中对进程分为六种,线程分为32级。一般咱们的线程是在16级以下的。但如果将进程的优先级调至Realtime,便可以将运行线程优先级调至16级以上,甚至可以调到最高的31级。这样线程被打断的机会就很少。除非系统中还有31级的线程在运行,系统不会打断线程。
下面是一个例子:
#include "windows.h"
DWORD WINAPI ThreadProc(LPVOID lpParam);
HANDLE hThreadEvent = 0;
HANDLE hCloseEvent = 0;
int _tmain(int argc, _TCHAR* argv[])
{
hThreadEvent = CreateEvent(0, true, false, _T("Thread Event"));
hCloseEvent = CreateEvent(0, true, false, _T("Close Event"));
SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);///设置进程类优先级
HANDLE hThread = CreateThread(0, 0, ThreadProc, 0, CREATE_SUSPENDED, 0);
SetProcessPriorityBoost(GetCurrentProcess(), true);///取消系统的动态提高线程优先级功能
SetThreadPriority(hThread, THREAD_PRIORITY_TIME_CRITICAL);///设置线程的优先级为关键时间
.........将其它的线程设为THREAD_PRIORITY_IDLE
ResumeThread(hThread);
SetEvent(hThreadEvent);
WaitForSingleObject(hCloseEvent, INFINITE);
CloseHandle(hThreadEvent);
CloseHandle(hCloseEvent);
SetPriorityClass(GetCurrentProcess(), NORMAL_PRIORITY_CLASS);
SetProcessPriorityBoost(GetCurrentProcess(), false);
getchar();
return 0;
}
DWORD WINAPI ThreadProc(LPVOID lpParam)
{
WaitForSingleObject(hThreadEvent, INFINITE);
...........线程代码
SetEvent(hThreadEvent);
SetEvent(hCloseEvent);
return 0;
}
如果你还想实现极为近似实时的线程,可以通过遍历所有运行的进程,将其设为SetProcessPriorityBoost(hProcess, true);SetPriorityClass(hProcess, IDLE_PRIORITY_CLASS);,或挂起进程
****另,这个程序必须在管理员权限下运行才能设定实时进程,否则系统还是以普通进程的方式运行(单核比多核效果要好)
在所有系统程序中还要注意Exporler是优先级最高的程序,它在平时是Idle的状态。只能有Keyboard or mouse Signal时, 就要被激活。如果想要让序运行得更为理想,可以关掉它,再运行。
(以上程序在Windows 2000/XP/Vista上测试过)