在使用线程编程时候,有时候不得不记住于系统的一些管理线程的办法,来提高线程的运作效率
一下分享windows系统关于线程池的使用方法类:
#include <windows.h>
#include <iostream>
#include <tchar.h>
#include <vector>
using namespace std;
//工作函数指针类型
typedef DWORD(WINAPI* WORKITEM)(LPVOID);
struct FUNCTIONINFO{
FUNCTIONINFO(){
cFunction=NULL;
pwParam=NULL;
dwFlag=WT_EXECUTELONGFUNCTION;
}
WORKITEM cFunction;
LPVOID pwParam;
DWORD dwFlag;
};
class CKpThreadPool
{
public:
CKpThreadPool(void);
~CKpThreadPool(void);
public:
void SingleWorkItem(WORKITEM cFunction,LPVOID pwParam,DWORD dwFlag=WT_EXECUTELONGFUNCTION);//一次添加单个线程
void MultiWorkItem(vector<FUNCTIONINFO*>& vecFunction) ;//一次添加多个线程
};
#include "KpThreadPool.h"
static DWORD g_dwBeginTime;
static LONG g_ulItemCount;
static HANDLE g_hEvent;
CKpThreadPool::CKpThreadPool(void)
{
}
CKpThreadPool::~CKpThreadPool(void)
{
}
/************************************************
函数名称:MultiWorkItem
函数功能:一次性添加多个函数到系统线程池队列
输入参数:
vecFunction vector<FUNCTIONINFO*>&
输出参数:
void
*************************************************/
void CKpThreadPool::MultiWorkItem(vector<FUNCTIONINFO*>& vecFunction)
{
HINSTANCE hInst=LoadLibrary(_T("Kernel32.DLL"));
if(hInst) {
typedef BOOL(WINAPI * MYFUNC)(LPTHREAD_START_ROUTINE, PVOID,ULONG);
MYFUNC MyQueueUserWorkItem=NULL;
//取得QueueUserWorkItem函数指针 使用系统生成的线程来执行自己的线程
MyQueueUserWorkItem=(MYFUNC)GetProcAddress(hInst,"QueueUserWorkItem");
if(!MyQueueUserWorkItem) {
MessageBox(NULL, _T("获取函数地址失败"),_T("错误提示"), MB_OK);
return;
}
for(int i=0; i<vecFunction.size(); i++) {//向系统线程池添加 自己的工作函数
MyQueueUserWorkItem(vecFunction[i]->cFunction, (PVOID)vecFunction[i]->pwParam, vecFunction[i]->dwFlag);
}
FreeLibrary(hInst);
}
}
/************************************************
函数名称:SingleWorkItem
函数功能:单个函数添加到系统线程池队列
输入参数:
cFunction 自己的工作函数
pwParam 函数参数
dwFlag 标识 WT_EXECUTELONGFUNCTION..WT_EXECUTEDEFAULT...
输出参数:
void
*************************************************/
void CKpThreadPool::SingleWorkItem(WORKITEM cFunction,LPVOID pwParam,DWORD dwFlag/*=WT_EXECUTELONGFUNCTION*/)
{
HINSTANCE hInst=LoadLibrary(_T("Kernel32.DLL"));
if(hInst) {
typedef BOOL(WINAPI * MYFUNC)(LPTHREAD_START_ROUTINE, PVOID,ULONG);
MYFUNC MyQueueUserWorkItem=NULL;
//取得QueueUserWorkItem函数指针 使用系统生成的线程来执行自己的线程
MyQueueUserWorkItem=(MYFUNC)GetProcAddress(hInst,"QueueUserWorkItem");
if(!MyQueueUserWorkItem) {
MessageBox(NULL, _T("获取函数地址失败"),_T("错误提示"), MB_OK);
return;
}
//向系统线程池添加 自己的工作函数
MyQueueUserWorkItem(cFunction, (PVOID)pwParam,dwFlag);
FreeLibrary(hInst);
}
}