zoukankan      html  css  js  c++  java
  • 转:线程池

    一个简单的片段  
      CThreadPool::CThreadPool()  
      {  
      int   i;  
      for(i=0;i<MAX_USER_CONNECTION;i++)  
      {  
      m_pThreads[i]=new   CCommandThread;  
      m_pThreads[i]->m_nID=i;  
      m_pThreads[i]->m_pPool=this;  
      }  
      m_pDataThreadPool=NULL;  
      }  
       
      CThreadPool::~CThreadPool()  
      {  
      int   i;  
      for(i=0;i<MAX_USER_CONNECTION;i++)  
      {  
      m_pThreads[i]->PostThreadMessage(WM_QUIT,NULL,NULL);  
      m_pThreads[i]->ResumeThread();  
      m_pThreads[i]=NULL;  
      }  
      if(m_pDataThreadPool!=NULL)  
      delete   m_pDataThreadPool;  
      m_pDataThreadPool=NULL;  
       
      }  
       
       
      BEGIN_MESSAGE_MAP(CThreadPool,   CWnd)  
      //{{AFX_MSG_MAP(CThreadPool)  
      ON_WM_TIMER()  
      //}}AFX_MSG_MAP  
      END_MESSAGE_MAP()  
       
       
      /////////////////////////////////////////////////////////////////////////////  
      //   CThreadPool   message   handlers  
       
      //创建线程并暂停  
      void   CThreadPool::CreateThreads()  
      {  
      int   i;  
      for(i=0;i<MAX_USER_CONNECTION;i++)  
      {  
      m_pThreads[i]->CreateThread(CREATE_SUSPENDED);  
      }  
       
      }  
       
      void   CThreadPool::Accept(SOCKET   hSocket)  
      {  
      CCommandThread   *pThread;  
      CCommandSocket   tSocket;  
      CString   IP,Str;  
      UINT   Port;  
      //得到当前可用的线程  
      pThread=GetFreeThread();  
      if(pThread==NULL)  
      {  
      tSocket.Attach(hSocket);  
      tSocket.GetPeerName(IP,Port);  
      Str.Format("因连接过多,来自\"%s:%d\"的连接被拒绝。",IP,Port);  
      SysLog.AddLogItem(Str,LT_SYSTEM);  
      tSocket.SendData(MSG_CONNECTBUSY);  
      tSocket.Close();  
      return;  
      }  
      tSocket.Attach(hSocket);  
      tSocket.GetPeerName(IP,Port);  
      Str.Format("\"%s:%d\"连接到本机。",IP,Port);  
      SysLog.AddLogItem(Str,LT_USER);  
      tSocket.Detach();  
      pThread->m_hSocket=hSocket;  
      pThread->PostThreadMessage(UM_COMMAND,UM_START_WORK,NULL);  
      pThread->ResumeThread();  
      }  
       
      //得到当前空闲的线程  
      CCommandThread*   CThreadPool::GetFreeThread()  
      {  
      int   i;  
      for(i=0;i<MAX_USER_CONNECTION;i++)  
      {  
      if(m_pThreads[i]->m_OnUsing==false)  
      {  
      m_pThreads[i]->m_OnUsing=true;  
      //此处要清理m_pThreads[i]的消息队列,不会做  
      return   m_pThreads[i];  
      }  
      }  
      return   NULL;  
      }  
  • 相关阅读:
    常用 SQL 语句
    Matalab IFS分形算法
    波粒二象性
    动态下载 Yahoo 网络数据存入 Microsoft SQL Server 再 Matlab 调用的一个完整例子
    4.交易测试
    协议 protocol
    iOS开发使用半透明模糊效果方法整理
    iOS App集成Apple Pay教程(附示例代码)
    iOS中四种实例变量的范围类型@private@protected@public@package
    隐藏TabBar的一些方法小结(适用与各种情况)
  • 原文地址:https://www.cnblogs.com/huking/p/1574447.html
Copyright © 2011-2022 走看看