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()   
     {   
     }   
    }; 
    

      

  • 相关阅读:
    一个页面从输入url到页面加载显示完成,中间都经历了什么
    获取鼠标点击的是那个键位、阻止鼠标点击的默认事件
    获取鼠标的位置
    图片上传
    jQuery实现瀑布流(pc、移动通用)
    怎么用js或jq点击展开,出现隐藏的DIV,点击收起DIV又隐藏起来.
    js商城倒计时
    页面跳转前动画加载,页面跳转后记住滚动位置
    乐观锁与悲观锁
    过滤器、监听器、拦截器的区别
  • 原文地址:https://www.cnblogs.com/SammyLan/p/2784218.html
Copyright © 2011-2022 走看看