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;  
      }  
  • 相关阅读:
    TLPI读书笔记第15章-文件属性2
    TLPI读书笔记第15章-文件属性1
    Java异常及错误
    10055
    4月。
    JavaScript三种方法获取地址栏参数的方法
    页面预加载loading动画,再载入内容
    什么是可串行化MVCC
    简化版扫雷详细解
    论unity中UI工具与GUI函数
  • 原文地址:https://www.cnblogs.com/huking/p/1574447.html
Copyright © 2011-2022 走看看