加载中…
个人资料
jackeagle
jackeagle
  • 博客等级:
  • 博客积分:0
  • 博客访问:9,516
  • 关注人气:0
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

线程池的应用

(2013-10-21 09:33:48)
标签:

线程池

it

分类: windows核心编程

//狼影-------2013.10.20     线程池的应用  
//下面的例子来自MSDN(建议大家如果英文可以的话请看原文)
//http://msdn.microsoft.com/en-us/library/windows/desktop/ms686980(v=vs.85).aspx

说明:
这个例子创建了一个自定义的线程池,创建了一个工作项和一个线程定时器
并关联了一个清理组。这个池包含了一个持久的线程.它示范了下面函数的应用:
CloseThreadpool         //销毁一个线程池
CloseThreadpoolCleanupGroup  //销毁线程池清理组
CloseThreadpoolCleanupGroupMembers  //释放指定清理组的成员
CloseThreadpoolWait  //释放一个等待对象
CreateThreadpool  //创建一个线程池
CreateThreadpoolCleanupGroup  //创建一个线程池的清理组
CreateThreadpoolTimer  //创建线程池定时器
CreateThreadpoolWait  //创建线程池等待对象
CreateThreadpoolWork  //创建线程池工作项
InitializeThreadpoolEnvironment  //初始化一个回调环境
SetThreadpoolCallbackCleanupGroup  //将一个指定的回调环境与一个指定的清理组相关联
SetThreadpoolCallbackPoo //将一个回调环境和一个线程池关联起来
       (只有这样在此环境中创建的工作项才能和指定的线程池关联起来)
SetThreadpoolThreadMaximum  //设置线程池中线程的最大数(默认是1-500)
SetThreadpoolThreadMinimum  //设置线程池中线程的最小数
SetThreadpoolTimer      //添加一个线程池定时器(每隔一段时间调用一个函数)
SetThreadpoolWait       //在线程池中设置等待对象
SubmitThreadpoolWork    //将工作项添加到线程池
WaitForThreadpoolWaitCallbacks  //等待一个等待项完成或取消等待项


 

#include "stdafx.h"
#include "windows.h"

VOID DemoCleanupPersistentWorkTimer();
VOID DemoNewRegisterWait();

//
//线程池定时器回调函数模板
//
VOID CALLBACK MyTimerCallback(
       PTP_CALLBACK_INSTANCE Instance,
       PVOID                  Context,
       PTP_TIMER              Timer);

//
//线程池等待回调函数模板
//
VOID CALLBACK MyWaitCallback(
     PTP_CALLBACK_INSTANCE  Instance,
     PVOID                  Context,
     PTP_WAIT               Wait,
     TP_WAIT_RESULT         WaitResult
     );
//
//线程池工作项回调函数模板
//
VOID CALLBACK MyWorkCallback(
       PTP_CALLBACK_INSTANCE Instance,
       PVOID                 Context,
       PTP_WORK              Work);

int _tmain(int argc, _TCHAR* argv[])
{
 DemoNewRegisterWait();
 DemoCleanupPersistentWorkTimer();


 return 0;
}

//创建一个新的线程池,并在新的线程池中,添加工作项,设置定时器,一个清理组
VOID DemoCleanupPersistentWorkTimer()
{
 PTP_POOL pool = NULL;
 PTP_TIMER timer = NULL;
 PTP_WORK work  = NULL;
 TP_CALLBACK_ENVIRON CallbackEnviron;
 PTP_CLEANUP_GROUP cleanupgroup;
 ULARGE_INTEGER uRelativeTime;
 FILETIME  fileTime;

 //初始化回调环境
 ::InitializeThreadpoolEnvironment(&CallbackEnviron);

 //创建一个自定义的专用的线程池
 pool = CreateThreadpool(NULL);
 if(NULL==pool)
 {
  printf("CreateThreadpool failed\n");
  return;
 }

 //设置线程池中线程的最小线程数和最大线程数
 //如果设置的一样大,线程池会创建一组线程,这些线程永远都不会销毁
 SetThreadpoolThreadMaximum(pool,1);
 SetThreadpoolThreadMinimum(pool,1);

 //创建一个清理组为这个线程池
 cleanupgroup = CreateThreadpoolCleanupGroup();
 if(NULL == cleanupgroup)
 {
  printf("CreateThreadpoolCleanuoGroup failed\n");
  CloseThreadpool(pool);
  return;
 }

 //将回调环境和创建的线程池关联
 SetThreadpoolCallbackPool(&CallbackEnviron,pool);

 //将回调环境与清理组相关联
 SetThreadpoolCallbackCleanupGroup(&CallbackEnviron,cleanupgroup,NULL);

 //在回调环境中创建一个工作项
 work = CreateThreadpoolWork(MyWorkCallback,NULL,&CallbackEnviron);
 if(NULL==work)
 {
  printf("CreateThreadpoolWork failed\n");
  CloseThreadpoolCleanupGroup(cleanupgroup);
  return;
 }
 //将工作项添加到线程池
 SubmitThreadpoolWork(work);

 //在回调环境中创建一个定时器
 timer  = CreateThreadpoolTimer(MyTimerCallback,NULL,&CallbackEnviron);
 if(NULL==timer)
 {
  printf("CreateThreadTimer failed\n");
  CloseThreadpoolCleanupGroupMembers(cleanupgroup,FALSE,NULL);
  return;
 }

 //将定时器添加到线程池
 uRelativeTime.QuadPart = (LONGLONG)-(10000000);//设置相对时间为1秒
 fileTime.dwHighDateTime = uRelativeTime.HighPart;
 fileTime.dwLowDateTime = uRelativeTime.LowPart;

 ::SetThreadpoolTimer(timer,&fileTime,1000,0);

 Sleep(5000); //延迟5秒

 //等待所有的回调函数执行完然后,释放对象
 CloseThreadpoolCleanupGroupMembers(cleanupgroup,FALSE,NULL);
}

//内核对象触发时调用一个函数的情况
VOID DemoNewRegisterWait()
{
 PTP_WAIT wait;
 HANDLE hEvent;


 //创建一个事件内核对象(自动重置,初始没有被触发)
 hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
 if(hEvent==NULL)
 {
  printf("事件内核对象创建失败,返回\n");
  return;
 }
 //创建一个线程池等待对象
 wait = CreateThreadpoolWait(MyWaitCallback,NULL,NULL);
 if(NULL==wait)
 {
  printf("线程池等待对象创建失败\n");
  ::CloseHandle(hEvent); //释放事件内核对象
  return;
 }

 //一旦线程池的一个线程调用了我们的回调函数,对应的等待项将进入不活跃的状态,
 //"不活跃"意味着如果想让回调函数在同一个内核对象被触发的时候再次被触发,那么我们
 //要再次调用SetThreadpoolWait()再次注册
 for(int i= 0; i<5; i++)
 {
  //这里作者要让线程执行回调函数5次,所以应该每次都应该先注册,原因如上所说
  SetThreadpoolWait(wait,hEvent,NULL); //最后一个参数表示线程池应该用多长时间来等待内核对象被触发
           //NULL表示无限的时间
  SetEvent(hEvent); //将事件内核对象设置为触发状态

  Sleep(500); //延缓500毫秒

  WaitForThreadpoolWaitCallbacks(wait,TRUE); //等待一个等待项完成
 }

 ::CloseHandle(hEvent);
 ::CloseThreadpoolWait(wait);
}

//在回调环境中的定时器回调函数
VOID CALLBACK MyTimerCallback(
       PTP_CALLBACK_INSTANCE Instance,
       PVOID                  Context,
       PTP_TIMER              Timer)
{
 UNREFERENCED_PARAMETER(Instance);
 UNREFERENCED_PARAMETER(Context);
 UNREFERENCED_PARAMETER(Timer);

 printf("MyTimerCallback:timer is fired\n");
}
//工作项的回调函数
VOID CALLBACK MyWorkCallback(
       PTP_CALLBACK_INSTANCE Instance,
       PVOID                 Context,
       PTP_WORK              Work)
{
 UNREFERENCED_PARAMETER(Instance);
 UNREFERENCED_PARAMETER(Context);
 UNREFERENCED_PARAMETER(Work);

 printf("MyWorkCallback: work is execute\n");
}
//等待对象回调函数
VOID CALLBACK MyWaitCallback(
     PTP_CALLBACK_INSTANCE  Instance,
     PVOID                  Context,
     PTP_WAIT               Wait,
     TP_WAIT_RESULT         WaitResult
     )
{
 //下面四个句子的意思是告诉编译器变量没有被用到
 //别让编译器报 警告
 UNREFERENCED_PARAMETER(Instance);
 UNREFERENCED_PARAMETER(Context);
 UNREFERENCED_PARAMETER(Wait);
 UNREFERENCED_PARAMETER(WaitResult);

 printf("MyWaitCallback: wait is over\n");
}

 

 

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
后一篇:数据对齐
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

    后一篇 >数据对齐
      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有