更新时间:2016-06-16 23:52:14浏览次数:1+次
DWORD WINAPI ThreadPoolProc(LPVOID lpParam)
{
while(1)
{
Sleep(1000);//睡眠一秒钟
}
}
这是最简单的线程函数了。不过就是不停的醒来-睡觉-醒来-睡觉。你可以看到,咱们这是连续的思维的发展,到了这一步,都是很自然而然的。我想你到这里,你也会和我一样继续往下想,该怎么给线程执行任务呢?这个任务以什么形式给线程呢?#include <Windows.h>
#include <iostream>
using namespace std;
DWORD WINAPI ThreadPoolProc(LPVOID lpParam)
{
while(1)
{
cout<<"哈哈哈,我是线程,我笑了。";
int i=0;
int j=0;
int k=i+j;
Sleep(1000);//睡眠一秒钟
}
}
现在线程虽然在做事了,但是并不是我们想要的。这里给的只是一个示例。你可以在这里写任何代码。但是你可以看到,不管你写成什么样,代码总是固定的,而且把剩饭炒来炒去的,也不能发挥实际的意义。这就好像跟工人说,你把这个砖从东边搬到西边,然后再从西边搬到东边,一直这样反反复复的做。这样工人确实在干活,但是对老板有什么意义呢?int tasklist[100]={0};//全局变量
//判断任务列表是否为空
bool isempty()
{
for(int i=0;i<100;i++)
{
if(tasklist[i]!=0)return false;
}
return true;
}
//判断任务列表是否满了
bool isfull()
{
for(int i=0;i<100;i++)
{
if(tasklist[i]==0)return false;
}
return true;
}
//取出一个任务
bool gettask(int& task)
{
for(int i=0;i<100;i++)
{
if(tasklist[i]!=0)
{
task = tasklist[i];
tasklist[i]=0;
return true;
}
}
return false;
}
//添加一个任务
bool addtask(int task)
{
for(int i=0;i<100;i++)
{
if(tasklist[i]==0)
{
tasklist[i] = task;
return true;
}
}
return false;
}
我们用数组元素的值来表示是否有任务,如果元素值为0,表示这个元素不是有效任务,如果所有的元素值都为0,表示任务列表为空,如果都不为0,表示任务列表满了。添加和取出任务也都是对一个元素进行值的操作,获取任务后,将对应的元素设置为0,表示这个任务取出执行了,如果返回值为false,表示没有取到任务。添加任务时,就是将值为0的设置为非零,设置为传入的参数task,如果返回为false,表示任务列表已满。#include <Windows.h>
#include <iostream>
#include <vector>
using namespace std;
vector<int> g_tasklist;//全局任务列表
void TaskProc(int i)//执行任务的函数
{
cout<<"线程"<<i<<"正在";
cout<<"假装处理任务,并且很快处理完了一个,剩余任务数:"<<g_tasklist.size()<<endl;
}
DWORD WINAPI ThreadPoolProc(LPVOID lpParam)
{
while(1)
{
if (g_tasklist.size()<=0)//判断任务是否为空
{
Sleep(5000);//任务为空,则多睡会
}
else
{
g_tasklist.pop_back();//有任务,则取出一个任务
//执行任务
TaskProc(*(int*)lpParam);//将创建线程时传入的序号提取出来
Sleep(1000);//执行完后休息一会
}
}
}
我们就知道了如何取得一个任务,也知道如何执行一个任务了。那么任务从哪来呢?任务列表的任务在哪里添加呢?void main()
{
HANDLE hThread[5]={0};
DWORD dwThreadID[5]={0};
static int id[5];
for (int i=0;i<5;i++)
{
id[i]=i;
hThread[i]=CreateThread(NULL,0,ThreadPoolProc,&id[i],0,&dwThreadID[i]);
}
while(1)
{
g_tasklist.push_back(0);
cout<<"新增1个任务.\n";
Sleep(2000);
}
}
主线程每隔2秒添加1个任务,这样任务列表不断的被取出,也不断的被添加,这样就形成了完整的任务机制了。我们可以看到,从创建线程池到任务机制建立,其实并没有太多的问题,当你看完这几篇文章后,就会感觉,其实并没有现象中的那么神秘和高深莫测。相关资讯