⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 basictaskscheduler.cpp

📁 rtsp协议的主要实现代码.对开发流媒体
💻 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 + -