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

📄 basictaskscheduler0.cpp

📁 H.264 RTSP 串流(live 555)視窗版本
💻 CPP
字号:
/**********This library is free software; you can redistribute it and/or modify it underthe terms of the GNU Lesser General Public License as published by theFree Software Foundation; either version 2.1 of the License, or (at youroption) any later version. (See <http://www.gnu.org/copyleft/lesser.html>.)This library is distributed in the hope that it will be useful, but WITHOUTANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESSFOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License formore details.You should have received a copy of the GNU Lesser General Public Licensealong with this library; if not, write to the Free Software Foundation, Inc.,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA**********/// Copyright (c) 1996-2010 Live Networks, Inc.  All rights reserved.// Basic Usage Environment: for a simple, non-scripted, console application// Implementation#include "BasicUsageEnvironment0.hh"#include "HandlerSet.hh"////////// A subclass of DelayQueueEntry,//////////     used to implement BasicTaskScheduler0::scheduleDelayedTask()class AlarmHandler: public DelayQueueEntry {public:  AlarmHandler(TaskFunc* proc, void* clientData, DelayInterval timeToDelay)    : DelayQueueEntry(timeToDelay), fProc(proc), fClientData(clientData) {  }private: // redefined virtual functions  virtual void handleTimeout() {    (*fProc)(fClientData);    DelayQueueEntry::handleTimeout();  }private:  TaskFunc* fProc;  void* fClientData;};////////// BasicTaskScheduler0 //////////BasicTaskScheduler0::BasicTaskScheduler0()  : fLastHandledSocketNum(-1) {  fHandlers = new HandlerSet;}BasicTaskScheduler0::~BasicTaskScheduler0() {  delete fHandlers;}TaskToken BasicTaskScheduler0::scheduleDelayedTask(int64_t microseconds,						 TaskFunc* proc,						 void* clientData) {  if (microseconds < 0) microseconds = 0;  DelayInterval timeToDelay((long)(microseconds/1000000), (long)(microseconds%1000000));  AlarmHandler* alarmHandler = new AlarmHandler(proc, clientData, timeToDelay);  fDelayQueue.addEntry(alarmHandler);  return (void*)(alarmHandler->token());}void BasicTaskScheduler0::unscheduleDelayedTask(TaskToken& prevTask) {  DelayQueueEntry* alarmHandler = fDelayQueue.removeEntry((long)prevTask);  prevTask = NULL;  delete alarmHandler;}void BasicTaskScheduler0::doEventLoop(char* watchVariable) {  // Repeatedly loop, handling readble sockets and timed events:  while (1) {    if (watchVariable != NULL && *watchVariable != 0) break;    SingleStep();  }}////////// HandlerSet (etc.) implementation //////////HandlerDescriptor::HandlerDescriptor(HandlerDescriptor* nextHandler)  : conditionSet(0), handlerProc(NULL) {  // Link this descriptor into a doubly-linked list:  if (nextHandler == this) { // initialization    fNextHandler = fPrevHandler = this;  } else {    fNextHandler = nextHandler;    fPrevHandler = nextHandler->fPrevHandler;    nextHandler->fPrevHandler = this;    fPrevHandler->fNextHandler = this;  }}HandlerDescriptor::~HandlerDescriptor() {  // Unlink this descriptor from a doubly-linked list:  fNextHandler->fPrevHandler = fPrevHandler;  fPrevHandler->fNextHandler = fNextHandler;}HandlerSet::HandlerSet()  : fHandlers(&fHandlers) {  fHandlers.socketNum = -1; // shouldn't ever get looked at, but in case...}HandlerSet::~HandlerSet() {  // Delete each handler descriptor:  while (fHandlers.fNextHandler != &fHandlers) {    delete fHandlers.fNextHandler; // changes fHandlers->fNextHandler  }}void HandlerSet::assignHandler(int socketNum, int conditionSet, TaskScheduler::BackgroundHandlerProc* handlerProc, void* clientData) {  // First, see if there's already a handler for this socket:  HandlerDescriptor* handler = lookupHandler(socketNum);  if (handler == NULL) { // No existing handler, so create a new descr:    handler = new HandlerDescriptor(fHandlers.fNextHandler);    handler->socketNum = socketNum;  }  handler->conditionSet = conditionSet;  handler->handlerProc = handlerProc;  handler->clientData = clientData;}void HandlerSet::clearHandler(int socketNum) {  HandlerDescriptor* handler = lookupHandler(socketNum);  delete handler;}void HandlerSet::moveHandler(int oldSocketNum, int newSocketNum) {  HandlerDescriptor* handler = lookupHandler(oldSocketNum);  if (handler != NULL) {    handler->socketNum = newSocketNum;  }}HandlerDescriptor* HandlerSet::lookupHandler(int socketNum) {  HandlerDescriptor* handler;  HandlerIterator iter(*this);  while ((handler = iter.next()) != NULL) {    if (handler->socketNum == socketNum) break;  }  return handler;}HandlerIterator::HandlerIterator(HandlerSet& handlerSet)  : fOurSet(handlerSet) {  reset();}HandlerIterator::~HandlerIterator() {}void HandlerIterator::reset() {  fNextPtr = fOurSet.fHandlers.fNextHandler;}HandlerDescriptor* HandlerIterator::next() {  HandlerDescriptor* result = fNextPtr;  if (result == &fOurSet.fHandlers) { // no more    result = NULL;  } else {    fNextPtr = fNextPtr->fNextHandler;  }  return result;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -