📄 basictaskscheduler.cpp
字号:
// BasicTaskScheduler.cpp: implementation of the BasicTaskScheduler class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "BasicTaskScheduler.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
BasicTaskScheduler::BasicTaskScheduler()
{
FD_ZERO(&fReadSet);
}
BasicTaskScheduler::~BasicTaskScheduler()
{
}
void BasicTaskScheduler::turnOnBackgroundReadHandling(int socketNum,
BackgroundHandlerProc* handlerProc,
void* clientData) {
if (socketNum < 0) return;
FD_SET((unsigned)socketNum, &fReadSet);
HanderSet * pHanderSet = new HanderSet;
pHanderSet->socketNum = socketNum;
pHanderSet->clientData = clientData;
pHanderSet->handlerProc = handlerProc;
fReadHandlers.push_back(pHanderSet);
}
void BasicTaskScheduler::turnOffBackgroundReadHandling(int socketNum) {
if (socketNum < 0) return;
FD_CLR((unsigned)socketNum, &fReadSet);
HanderSet * pHanderSet = NULL;
for(list<HanderSet *>::iterator it = fReadHandlers.begin(); it != fReadHandlers.end(); it++)
{
pHanderSet = *it;
if(pHanderSet->socketNum == socketNum)
{
break;
}
}
if(pHanderSet)
{
fReadHandlers.erase(it);
delete pHanderSet;
}
}
void BasicTaskScheduler::doEventLoop()
{
while(1)
{
SingleStep();
Sleep(100);
}
}
void BasicTaskScheduler::SingleStep()
{
fd_set readSet = fReadSet; // make a copy for this select() call
struct timeval tv_timeToDelay;
tv_timeToDelay.tv_sec = 100;
int selectResult = select(NULL, &readSet, NULL, NULL,
&tv_timeToDelay);
if (selectResult < 0)
{
int err = WSAGetLastError();
// For some unknown reason, select() in Windoze sometimes fails with WSAEINVAL if
// it was called with no entries set in "readSet". If this happens, ignore it:
if (err == WSAEINVAL && readSet.fd_count == 0) {
err = 0;
// To stop this from happening again, create a dummy readable socket:
int dummySocketNum = socket(AF_INET, SOCK_DGRAM, 0);
FD_SET((unsigned)dummySocketNum, &fReadSet);
}
if (err != 0)
exit(0);
}
HanderSet * pHanderSet = NULL;
for(list<HanderSet *>::iterator it = fReadHandlers.begin(); it != fReadHandlers.end(); it++)
{
pHanderSet = *it;
if (FD_ISSET(pHanderSet->socketNum, &readSet) &&
FD_ISSET(pHanderSet->socketNum, &fReadSet) /* sanity check */ &&
pHanderSet->handlerProc != NULL) {
fLastHandledSocketNum = pHanderSet->socketNum;
// Note: we set "fLastHandledSocketNum" before calling the handler,
// in case the handler calls "doEventLoop()" reentrantly.
(*pHanderSet->handlerProc)(pHanderSet->clientData, SOCKET_READABLE);
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -