多线程之六脉神剑
#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;
}