zoukankan      html  css  js  c++  java
  • 线程池之异步方式调用函数

    (一)分类:

      1、不创建工作项的方式

      2、通过创建一个工作项的方式

    (二)不创建工作项的方式

      步骤:

        1、写一个类似void NTAPI SimpleCallback(PTP_CALLBACK_INSTANCE pInstance,PVOID pvContext),名字可以自己写

        2、TrySubmitThreadpoolCallback,通过这个函数,将一个工作项添加到线程池的队列中。

      代码:

    #include <iostream>
    #include <afx.h>
    using namespace std;
    
    void NTAPI SimpleCallback(PTP_CALLBACK_INSTANCE pInstance,
    	PVOID pvContext)
    {
    	cout << "线程ID: " << GetCurrentThreadId() << endl;
    }
    
    void main()
    {
    	TrySubmitThreadpoolCallback(SimpleCallback, NULL, NULL);
    	Sleep(1000);	//确定用同一个线程来执行
    	TrySubmitThreadpoolCallback(SimpleCallback, NULL, NULL);
    	Sleep(1000);	//确保2个线程都能够被执行
    }

      结果:

      思考:

        其实我们还可以不用第一个Sleep,我们会发现线程ID是不同的。这就更加证明了这是一个线程池。 

    (三)创建一个工作项的方式

      步骤:

        1、写一个类似void NTAPI SimpleCallback(PTP_CALLBACK_INSTANCE pInstance, PVOID pvContext, PTP_WORK Work)名字可以自己写

        2、CreateThreadpoolWork,创建一个工作项

        3、SubmitThreadpoolWork,提交请求

        4、CloseThreadpoolWork,关闭工作项

      代码:

      

    #include <iostream>
    #include <afx.h>
    using namespace std;
    
    void NTAPI SimpleCallback(PTP_CALLBACK_INSTANCE pInstance,
    	PVOID pvContext, PTP_WORK Work)
    {
    	cout << "线程ID: " << GetCurrentThreadId() << endl;
    }
    
    void main()
    {
    	PTP_WORK pWork = CreateThreadpoolWork(SimpleCallback, NULL, NULL);
    	SubmitThreadpoolWork(pWork);
    	Sleep(1000);	//确定用同一个线程来执行
    	SubmitThreadpoolWork(pWork);
    	SubmitThreadpoolWork(pWork);
    	Sleep(1000);	//确保线程函数都能够被执行
    
    	CloseThreadpoolWork(pWork);
    }
    

       结果:

      

      思考:

      《Windows核心编程》:每一次调用TrySubmitThreadpoolCallback的时候,系统会在内部以我们的名义分配一个工作项。如果打算提交大量的工作项,那么出于性能和内存使用的考虑,创建工作项一次,并多次提交它会更好。

  • 相关阅读:
    SpannaleString总结
    【未完成】bug记录2013427>import工程时出现Build path contains duplicate entry:'src' for project 'XXX'
    【未完成】给eclipse项目改名
    android创建和删除桌面快捷方式
    bug记录2013426(2)>Select at least one project错误
    hosts配置
    获取当前应用的版本号及android系统版本号及手机型号
    转载:如何将offcie 2003文档(.doc、.xls、.ppt)转换成mht文档
    转载:.NET2.0 验证控件常用的正则表达式
    转载: RESTORE DATABASE命令还原SQLServer 2005 数据库
  • 原文地址:https://www.cnblogs.com/wang-can/p/3340151.html
Copyright © 2011-2022 走看看