c++程序员修炼真经之四

多线程之六脉神剑
#define MAX_JOBS  64
HANDLE gDispatchJobs[MAX_JOBS];
下面是假设的两个线程函数原型
static UINT WINAPI pf_NetWorkThread(void *pVoid);
static UINT WINAPI pf_CollectInfoThread(void *pVoid);
实现
UINT WINAPI CNetWorkCommunicateModel::pf_CollectInfoThread(void *pVoid)
{

 CNetWorkCommunicateModel *This = (CNetWorkCommunicateModel*)pVoid;
 DWORD   ThreadId;
 ostringstream runLogStream;
 if ( This == NULL )
  return 0;

 if(This->m_dwCollectThreadId)
  return 0;
 This->m_dwCollectThreadId = GetCurrentThreadId();
 
 //if((This->m_clientSocket=WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,WSA_FLAG_OVERLAPPED))

==INVALID_SOCKET)
 if((This->m_clientSocket=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))==INVALID_SOCKET)
 {
   return false;
 }
 if(This->m_curEventIndex==0)
 {
  if((This->EventArray[This->m_curEventIndex]=WSACreateEvent())==WSA_INVALID_EVENT)
  {
     return false;
  }
 }
 This->EventTotal=1;

 /*if (WSASetEvent(EventArray[0]) == FALSE)
 {       
    return false;
 }*/
 while(1)
 {
  if(SOCKET_ERROR==connect(This->m_clientSocket,(SOCKADDR*)(&(This->SockAddr)),sizeof

(SOCKADDR_IN)))
  {
     DWORD ErrorCode = WSAGetLastError();
     runLogStream.str("");
     runLogStream<<"自动重连正在运行/n";
     LOG(Log_Debug,runLogStream.str().c_str());
     Sleep(30);
     continue;
  }
  else
  {
   break;
  }
 }
 //WSAEventSelect(g_socket.Socket,EventArray[0],FD_CONNECT|FD_READ|FD_WRITE|FD_CLOSE);

 WSAEventSelect(This->m_clientSocket,This->EventArray[This-

>m_curEventIndex],FD_CONNECT|FD_READ|FD_WRITE|FD_CLOSE);
 
 if(This->m_dwNetWorkThreadId==0)
 {
  This->runThread(CNetWorkCommunicateModel::pf_NetWorkThread,This,1);
 }
 This->m_dwCollectThreadId= 0;

 return 0;

}
UINT WINAPI CNetWorkCommunicateModel::pf_NetWorkThread(void *pVoid)
{
   CNetWorkCommunicateModel * PTHIS=(CNetWorkCommunicateModel *)pVoid;
    if (PTHIS== NULL )
  return 0;

 if(PTHIS->m_dwNetWorkThreadId)
  return 0;
   PTHIS->m_dwNetWorkThreadId=GetCurrentThreadId();

   DWORD Index;

   while(TRUE)
   {

      Index = WSAWaitForMultipleEvents(PTHIS->EventTotal,PTHIS->EventArray,FALSE,WSA_INFINITE,FALSE);
   if ((Index==WSA_WAIT_FAILED)||(Index==WSA_WAIT_TIMEOUT))
   {
    continue;
   }
      else
   {
  if(PTHIS->HandleIo(PTHIS->m_clientSocket,PTHIS->EventArray[PTHIS->m_curEventIndex]))
  {
   PTHIS->m_dwNetWorkThreadId=0;
   WSASetEvent(PTHIS->EventArray[PTHIS->m_curEventIndex]);
   PTHIS->runThread(CNetWorkCommunicateModel::pf_CollectInfoThread,PTHIS,1);
   break;
  }
   }
   }
}
主进程中:
DWORD status;
for (index = 0; index < gNumJobs; index++)
{
 do
 { 
  GetExitCodeThread(gDispatchJobs[index], &status);
  Sleep(10);
 } while (status == STILL_ACTIVE);
}
少商剑:CreateThread
bool CNetWorkCommunicateModel::InitNetWork(CWnd * pWnd,ONEVENTEXECUTE pFunc)
{
DWORD dwThreadId;
HANDLE hThread;
hThread = CreateThread(NULL,0,CNetWorkCommunicateModel::pf_CollectInfoThread,(LPVOID)this,0, &dwThreadId

));
SetThreadPriority(hThread,THREAD_PRIORITY_BELOW_NORMAL);
}
商阳剑:AfxBeginThread
bool CNetWorkCommunicateModel::InitNetWork(CWnd * pWnd,ONEVENTEXECUTE pFunc)
{
AfxBeginThread(pf_CollectInfoThread,LPVOID(this));
}
中冲剑:_beginthreadex/_beginthread

bool CNetWorkCommunicateModel::InitNetWork(CWnd * pWnd,ONEVENTEXECUTE pFunc)
{
 UINT   hWorkerThreadID;
 
 HANDLE hWorkerThread = (HANDLE) _beginthreadex(NULL,0,pf_CollectInfoThread,(void *)(this), 0,

&hWorkerThreadID);
 //或使用_beginthread(pf_CollectInfoThread,0,NULL)不推荐使用;
 if ( hWorkerThread != NULL ) {
  
  CloseHandle((HANDLE) hWorkerThread);
  return true;
 }
 else {
  
  return false;
 }
}
关冲剑:从CWinThread继承
class CCDNClient : public CWinThread
{
 DECLARE_DYNCREATE(CCDNClient)

public:
 CCDNClient();           // 动态创建所使用的受保护的构造函数
 virtual ~CCDNClient();

public:
 virtual BOOL InitInstance();
 virtual int ExitInstance();

protected:
 DECLARE_MESSAGE_MAP()

public:
 BOOL m_bStop;
 DWORD m_tActive;
 BOOL Start();
 void Pause(void);
 void Stop(void);
 virtual int Run();
};
实现:
IMPLEMENT_DYNCREATE(CCDNClient, CWinThread)

CCDNClient::CCDNClient()
: m_tActive(0)
, m_bStop(FALSE)

{
}

CCDNClient::~CCDNClient()
{
}

BOOL CCDNClient::InitInstance()
{

 return TRUE;
}

int CCDNClient::ExitInstance()
{

 return CWinThread::ExitInstance();
}

BEGIN_MESSAGE_MAP(CCDNClient, CWinThread)
END_MESSAGE_MAP()

 


BOOL CCDNClient::Start()
{
 if( m_bStop)
 {
  m_bStop = FALSE;
  this->ResumeThread();
  
 }
 else
 {
  this->m_bAutoDelete = FALSE;
  this->CreateThread();
 }
 return true;
}

int CCDNClient::Run()
{
 //这里是你的具体业务代码
 return CWinThread::Run();
}


void CCDNClient::Pause()
{
 SuspendThread();
 m_bStop = TRUE;
}
void CCDNClient::Stop(void)
{
 SuspendThread();
 m_bStop = TRUE;
 ::TerminateThread( this->m_hThread, 0);
}
少冲剑:
线程数据传递:消息传递
bool Thread::ProcessMessages(int cmsLoop)
{ while (true)
  {  
      Message msg;
      if (!Get(&msg, cmsNext))
         return false;
       Dispatch(&msg);
  }
}
少泽剑:利用完成端口
unsigned __stdcall ThreadModule::ExecuteTaskThread(void* lpParam)
{

 ThreadModule* pThis = (ThreadModule*)lpParam;

 HANDLE IoPort = pThis->m_hSendWorkerIoPort;
 unsigned long pN1, pN2;
 OVERLAPPED* pOverLapped;
 unsigned long nTotalLen;
 unsigned int nRecordLen;
 __int64 syncId;
 int userId;
 int proSql;
 string sqlName;
 int nParamCount;
 string strParamvalue;

 vector<string> resultVect;
 int nparmaLen;
 while(::GetQueuedCompletionStatus(IoPort, &pN1, &pN2,
  (LPOVERLAPPED* )&pOverLapped,INFINITE))
 {
  if(pOverLapped==(OVERLAPPED*)0xFFFFFFFF)
   break;
  else
  {
   pThis->m_ExecuteTask_Lock.writeEnter();
   CagreementPacket<int,unsigned char> *

ptr_Agreement=reinterpret_cast<CagreementPacket<int,unsigned char> *>(pN2);
   ptr_Agreement->readDataHead(nTotalLen,sizeof(unsigned long));
   ptr_Agreement->readRecordCount(nRecordLen,sizeof(unsigned int));
   for (int i=0;i<nRecordLen;i++)
   {
    ptr_Agreement->readField(syncId,sizeof(__int64));
    ptr_Agreement->readField(userId,sizeof(int));
    ptr_Agreement->readField(proSql,sizeof(int));
    ptr_Agreement->readField(sqlName,proSql);
    ptr_Agreement->readField(nParamCount,sizeof(int));

    for (int k=0;k<nParamCount;k++)
    {
     ptr_Agreement->readField(nparmaLen,sizeof(int));
     ptr_Agreement->readField(strParamvalue,nparmaLen);
     resultVect.push_back(strParamvalue);
     strParamvalue="";
    }
    sqlName="";
   }
   delete ptr_Agreement;
   pThis->m_ExecuteTask_Lock.leave();
  }
 }
 return 0;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值