Windows API 中的SetThreadPriority()

来源:互联网 发布:c 语言标准函数库速查 编辑:程序博客网 时间:2024/05/16 01:04

我们都知道线程的执行是没有顺序的,比如下面的例子,有三个线程,分别输出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);    //指定的线程句柄   //线程相对优先级

 (取值对应如下)

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

1THREAD_PRIORITY_TIME_CRITICALTime-critical,关键时间(最高)

2THREAD_PRIORITY_HIGHESTHighest,最高(其实是次高

3THREAD_PRIORITY_ABOVE_NORMALAbove normal,高于标准

4THREAD_PRIORITY_NORMALNormal,标准

5THREAD_PRIORITY_BELOW_NORMALBelow normal,低于标准

6THREAD_PRIORITY_LOWESTLowest,最低(其实是次低

7THREAD_PRIORITY_IDLEIdle,空闲(最低)

你可以呼叫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);

操作系统会动态地提高线程的基础优先级等级(031),一般是为了响应一些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 ,优先级)

1 0
原创粉丝点击