您的位置:首页 > 其它

Windows API 中的SetThreadPriority()

2016-04-08 20:29 330 查看
我们都知道线程的执行是没有顺序的,比如下面的例子,有三个线程,分别输出Hello word!   I am sleeping!  Please wait...  I am awake ,如果我们不加控制,那么运行出来的结果可能是 I
am sleeping!  Hello word!   Please wait...  I am awake或者其他的情况。那么下面就讲一下怎么让其按照指定的顺序执行。

当一个线程被创建,它的“线程相对优先级”默认为normal(标准)。CreateThread函数没有提供设置线     程相对优先级的功能。可以调用SetThreadPriority函数设置一个线程的相对优先级。

 BOOL SetThreadPriority(HANDLE hThread,   nt nPriority);    //指定的线程句柄   //线程相对优先级

 (取值对应如下)

该函数接受一个线程句柄和线程相对优先级取值,设置对应的线程的相对优先级。该线程相对优先级取值如下:

1、THREAD_PRIORITY_TIME_CRITICAL:Time-critical,关键时间(最高)

2、THREAD_PRIORITY_HIGHEST:Highest,最高(其实是“次高”)

3、THREAD_PRIORITY_ABOVE_NORMAL:Above normal,高于标准

4、THREAD_PRIORITY_NORMAL:Normal,标准

5、THREAD_PRIORITY_BELOW_NORMAL:Below normal,低于标准

6、THREAD_PRIORITY_LOWEST:Lowest,最低(其实是“次低”)

7、THREAD_PRIORITY_IDLE:Idle,空闲(最低)

你可以呼叫GetTreadPriotiry函数取得一个特定线程的相对优先级。

int GetThreadPriority(HANDLE hThread);      //函数返回上述7个取值

为了创建一个线程相对优先级不是标准的线程,比如要创建一个高于标准的线程,你可以传递CREATE_SUSPENDED参数给CreateThread,从而创建一个起始状态为“挂起”的线程,然后调用SetThreadPriority函数设置该线程的相对优先级,然后调用ResumeThread函数恢复该线程的运行。代码如下:

DWORD dwThreadID;

HANDLE hThread =CreateThread(NULL, 0, ThreadFunc, NULL,CREATE_SUSPENDED, &dwThreadID);
SetThreadPriority(hThread, THREAD_PRIORITY_ABOVE_NORMAL);
ResumeThread(hThread);
CloseHandle(hThread);

操作系统会动态地提高线程的基础优先级等级(0~31),一般是为了响应一些I/O事件。

 不理解的话,运行一下下面的程序:

// ThreadCreate.cpp : Defines the entry point for the console application.

//

#include "stdafx.h"

#include "ThreadCreate.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

// The one and only application object

CWinApp theApp;

 

using namespace std;

void ThreadName1();

void ThreadName2();

void ThreadName3();

static HANDLE hHandle1=NULL;

static HANDLE hHandle2=NULL;

static HANDLE hHandle3=NULL;

DWORD dwThreadID1;

DWORD dwThreadID2;

DWORD dwThreadID3;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])

{
int nRetCode = 0;

hHandle1=CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_START_ROUTINE)ThreadName1,(LPVOID)NULL,0,&dwThreadID1);
SetThreadPriority(hHandle1,THREAD_PRIORITY_HIGHEST);
CloseHandle(hHandle1);
hHandle2=CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_START_ROUTINE)ThreadName2,(LPVOID)NULL,0,&dwThreadID2);
SetThreadPriority(hHandle2,THREAD_PRIORITY_NORMAL);
CloseHandle(hHandle2);
hHandle3=CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_START_ROUTINE)ThreadName3,(LPVOID)NULL,0,&dwThreadID3);
SetThreadPriority(hHandle3,THREAD_PRIORITY_BELOW_NORMAL);
CloseHandle(hHandle3);

ExitThread(0);
return nRetCode;

}

void ThreadName1()

{
printf("Hello word!\n");

}

void ThreadName2()

{
printf("I am sleeping!\n");

}

void ThreadName3()

{
printf("Please wait...\n");
Sleep(1000);
printf("I am awake");

}

//怎么让其有顺序地执行,用SetThreadPriority(HANDLE ,优先级)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: