实现实时线程

来源:互联网 发布:php微信商城系统开发 编辑:程序博客网 时间:2024/05/22 01:15

 

不知道你们做程序时,是不是希望有时候线程运行时不易被系统调度打断。

我最近发现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上测试过)

 

原创粉丝点击