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 ,优先级)
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 ,优先级)
相关文章推荐
- 关于java的枚举
- 最新资源分享
- JAVA基础(五)IO(三)包含装饰者设计模式
- hdu 1039 Easier Done Than Said?
- HDU 5655 CA Loves Stick 水题
- 2-jQuery - AJAX load() 方法【进阶篇】
- BZOJ3124: [Sdoi2013]直径
- 为何moov头在尾部的mp4可以快速播放、拖动
- 取悦生活还是取悦自己
- Android 自定义SurfaceView实现加载GIF动画
- 《C++编程思想》第二章习题
- Linux上yum安装svn并使用钩子实现自动更新
- 做汉堡
- 垂直水平双向居中的弹窗 以及 移动端屏幕适配
- 京东2016实习生招聘 C++开发工程师 在线考试(编程题第二题:选举游戏)
- JDBC事务
- Notes on git
- CoreText NSTextView和Attribued String
- 手机使用sideload升级失败 解决办法
- [IO]——节点流