Icebound

icebound-area

智障学写程序系列④【报警系列】

本次出现了一些奇怪的问题。。。导致最后结果跟预期的不一样。。
110,我要报警
内容:
线程的优先级

线程是分级的!
有以下几种优先级
THREAD_PRIORITY_TIME_CRITICAL:Time-critical 关键时间
THREAD_PRIORITY_HIGHEST:Highest 最高
THREAD_PRIORITY_ABOVE_NORMAL:Above normal 高于标准
THREAD_PRIORITY_NORMAL:Normal 标准
THREAD_PRIORITY_BELOW_NORMAL:Below normal 低于标准
THREAD_PRIORITY_LOWEST:Lowest 最低
THREAD_PRIORITY_IDLE:Idle 空闲

在线程挂起时可以改变其优先级
我们想要创建一个高优先级进程时,create时把那个是否运行设置为 CREATE_SUSPENDED 即可在创建完毕之后挂起它
使用SetThreadPriority函数来改变优先级:两个参数 句柄 优先级
于是我打算试一试那个TIME_CRITICAL和IDLE究竟差多少
搞了两个函数,一个输出233,一个输出666 都输出10次 233函数是TIME_CRITICAL 666函数是IDLE
我以为结果会是前面一片233,最后有几个666。。然而最后结果是这样的

妈的什么鬼?
猜想了一下,可能是因为I/O流的问题。。。
必须得祭出time.h大法啦!
time.h里面有一个clock()函数,返回当前进程启动的时间
于是我搞了个二维数组用来存时间
两个函数边Sleep边获取clock()
当我以为计划通的时候。。。
这是运行结果:

再一次蒙B
这什么鬼。。。明明都是同时运行的!
我要报警了。
上中国某CS*N论坛查了一下。。似乎是系统会自己调优先级
用SetThreadPriorityBoost这个玩意似乎可以禁止系统调优先级
然后不管用。。。
于是又去某论坛查了下,似乎是CPU的锅。
不管啦。。
就这样了。。总之没有达到预期的结果
不过据说这个优先级还是很管用的。。。
不管用的代码:

#include<windows.h>
#include<iostream>
#include<cstdio>
#include<ctime>
using namespace std;
clock_t t[2][15];
DWORD WINAPI th1(LPVOID lpParam)
{
	for(int i=1;i<=10;i++)Sleep(200),t[0][i]=clock();
	return 0;
}
DWORD WINAPI th2(LPVOID lpParam)
{
	for(int i=1;i<=10;i++)Sleep(200),t[1][i]=clock();
	return 0;
}
HANDLE h[5];
DWORD temp;
int main()
{
	t[0][1]=clock();
	h[0]=::CreateThread(NULL,NULL,th1,NULL,CREATE_SUSPENDED,&temp);
	SetThreadPriority(h[0],THREAD_PRIORITY_TIME_CRITICAL);
	h[1]=::CreateThread(NULL,NULL,th2,NULL,CREATE_SUSPENDED,&temp);
	SetThreadPriority(h[1],THREAD_PRIORITY_IDLE);
	SetThreadPriorityBoost(h[0],0);
	SetThreadPriorityBoost(h[1],0);
	::ResumeThread(h[1]),::ResumeThread(h[0]);
	::WaitForMultipleObjects(2,h,1,INFINITE);
	for(int i=1;i>=0;i--)::CloseHandle(h[i]);
	for(int i=1;i<=10;i++)cout<<"第"<<i<<"次结果:"<<t[0][i]<<" "<<t[1][i]<<endl;
	return 0;
}
  1. zengda说道:

    不错,不错,看看了!

  2. Lensual说道:

    报警报警,你的图床宕了

  3. 422199653说道:

    博客多久更新一次?

  4. 1581133034说道:

    我又来了,您高兴吗?!