kenlistian

厚积薄发. 勤为桨,思为帆

   :: 首页 :: 新随笔 ::  :: 聚合  :: 管理 ::
  73 随笔 :: 4 文章 :: 22 评论 :: 0 Trackbacks

这是一个简单的线程池代码,它创建一个线程队列,通过定义不同的消息,在不同的消息处理中不同的部分,这样当启动不同任务线程时,可以通过传入不同参数来处理不同的处理部分。

来处理实际的部分,

单独部分,

列出主程序代码

#include "stdafx.h"
#include "Pool.h"

int main(int argc, char* argv[])
{
    Pool thread;               //定义1个放置线程的池
    Sleep(1000);
   for (int i=0;i<10;i++)
  {
      thread.DoWork();          //运行池中线程
  }
     return 0;
}

//在建立一个线程池类,头文件

class Pool 
{
public:

    //声明为静态函数,方可在线程中建立
 static DWORD WINAPI ThreadProc(void * p);  

 int DoWork();
 Pool();
 virtual ~Pool();

private:
 static CRITICAL_SECTION sm_cs;
 std::queue<DWORD> m_qidThread;      //采用了stl中的队列存放开辟的线程

};

 

///////////////////////pool实现部分

#define MYMESSAGE (WM_USER+1000)    //自定义在线程中处理的消息
#define NUMTHREADS 10                        

CRITICAL_SECTION Pool::sm_cs;             //声明一个临界区,当在线程下操作界

                                                                   //面时,必须考虑到这是不能在线程下跑的

Pool::Pool()
{
 ::InitializeCriticalSection(&sm_cs);

 for (int i=0;i<10;i++)               //工作时立即创建10个线程,并保存在线程队列中
 {
  DWORD dw;
  HANDLE thread = ::CreateThread(NULL, 0, ThreadProc, NULL, 0, &dw);
  ::CloseHandle(thread);
  m_qidThread.push(dw);
 }
}

Pool::~Pool()
{
 while (!m_qidThread.empty())
 {
  ::PostThreadMessage(m_qidThread.front(), WM_QUIT, 0, 0);  //通知线程你要退出了
  m_qidThread.pop();
 }
 ::DeleteCriticalSection(&sm_cs);
}

DWORD WINAPI Pool::ThreadProc(void *p)
{
  MSG msg;
  while (::GetMessage(&msg, NULL, 0, 0)>0)
  {
    switch (msg.message)
    {
      case MYMESSAGE:
    //////////////////////////////////////
    // 这里加入自己的实际代码
    //
//    ::EnterCriticalSection(&sm_cs);
    std::cout << "Hello World! from Thread Number: " << ::GetCurrentThreadId() <<   std::endl;
//    ::LeaveCriticalSection(&sm_cs);

     case MYMESSAGE2:          //可以加更多的自定义消息

        //   。。。。

          break;

      default:      break;
    };
  };
  return 0;
}

//DoWork 完全可以带参数进去调用不同的消息体部分

int Pool::DoWork()
{
 DWORD dw = m_qidThread.front();
  ::PostThreadMessage(dw, MYMESSAGE, 0, 0);  //通知处理自定义消息部分的实际内容了
 m_qidThread.pop();
 m_qidThread.push(dw);
  return 0;
 
}

posted on 2006-05-25 20:12 kenlistian 阅读(787) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理