zoukankan      html  css  js  c++  java
  • 一组便于创建线程和线程池的简单封装函数

    /** 
    @file 
    @brief		
    @version	2012-11-08 SammyLan
    */
    
    #pragma once
    #include <memory>
    BEGIN_NAMESPACE(XLANUtil)
    template <typename T>
    class XLANThreadPool
    {
    	typedef std::pair<void (T::*)(), T *> ThreadInfo;
    public:
        static BOOL QueueUserWorkItem(void (T::*function)(void), T *object, ULONG flags = WT_EXECUTELONGFUNCTION)
        {        
            std::auto_ptr<ThreadInfo> p(new ThreadInfo(function, object));
            if (::QueueUserWorkItem(ThreadProc, p.get(), flags))
            {
                //现在由线程函数负责删除前面申请的内存
    			p.release();
                return TRUE;
            }
            else
            {
                return FALSE;
            }
        }
    
    private:
    	static DWORD WINAPI ThreadProc(PVOID context)
        {
    		std::auto_ptr<ThreadInfo> p(static_cast<ThreadInfo *>(context));
            (p->second->*p->first)();
            return 0;
        }
    };
    template <typename T>
    inline BOOL XLANQueueUserWorkItem(T *object,void (T::*function)(void), ULONG flags = WT_EXECUTELONGFUNCTION)
    {
    	return XLANThreadPool<T>::QueueUserWorkItem(function,object,WT_EXECUTELONGFUNCTION);
    }
    
    
    
    template <typename T>
    class XLANThreadObject
    {
    	typedef unsigned int uint;
    	typedef std::pair<void (T::*)(), T *> ThreadInfo;
    public:
    	static HANDLE CreateThread(void (T::*function)(void), T *object)
    	{        
    		std::auto_ptr<ThreadInfo> p(new ThreadInfo(function, object));
    		uint dwTHreadID = 0;
    		HANDLE hThread = (HANDLE)_beginthreadex( NULL, 0, &ThreadProc, p.get(),0,&dwTHreadID);
    		if (hThread != NULL)
    		{
    			//现在由线程函数负责删除前面申请的内存
    			p.release();
    		}
    		return hThread;
    	}
    
    private:
    	static uint WINAPI ThreadProc(PVOID context)
    	{
    		std::auto_ptr<ThreadInfo> p(static_cast<ThreadInfo *>(context));
    		(p->second->*p->first)();
    		return 0;
    	}
    };
    template <typename T>
    inline HANDLE XLANCreateThread(T *object,void (T::*function)(void))
    {
    	return XLANThreadObject<T>::CreateThread(function,object);
    }
    END_NAMESPACE()
    

      例子:

    #include "XLANUtil/XLANThreadPool.h"   
    class MyTest   
    {   
    public:   
     void Test()   
     {   
      XLANUtil::XLANCreateThread(this,&MyTest::Calc);   
      XLANUtil::XLANQueueUserWorkItem(this,&MyTest::Calc);   
     }   
    private:   
     void Calc()   
     {   
     }   
    }; 
    

      

  • 相关阅读:
    安卓模拟器genimotion安装过程
    python3安装过程
    python基础数据类型数字和字符串
    genimotion模拟器和appium环境配置
    ArcEngine中的ICommand和ITool
    BM.AE介绍
    地图数据和版式数据联动
    BM.AE中的命令工具体系
    2021年1月1日 AutoCAD.Net/C#.Net QQ群:193522571获取任意路径dwg文件内所有块在控件中显示并能选择插入当前模型空间
    2021年1月1日 AutoCAD.Net/C#.Net QQ群:193522571用acedGrRead()函数实现一拖多
  • 原文地址:https://www.cnblogs.com/SammyLan/p/2784218.html
Copyright © 2011-2022 走看看