void InitEvent( word num) /* init manager for num events */ { /* Setup the event queue. */ evQueue = (REventRecord *) NeedPtr(num * sizeof(REventRecord)); evHead = evTail = evQueue; evQueueEnd = (evQueue + num); /* Load and initialize the keyboard driver. */ if (kbdDriver == NULL || (kbdHandle = LoadHandle(kbdDriver)) == NULL) { RAlert(E_NO_KBDDRV); exit(1); } else { LockHandle(kbdHandle); keyboard = *kbdHandle; KeyboardDriver(D_INIT); InstallServer(PollKeyboard, 1); } /* If there is a joystick, load and initialize the joystick driver. */ if (joyDriver != NULL && (joyHandle = LoadHandle(joyDriver)) != NULL) { LockHandle(joyHandle); joystick = *joyHandle; JoystickDriver(D_INIT); } }
//设置定时器 bool __cdecl CTimerEngine::SetTimer(WORD wTimerID, DWORD dwElapse, DWORD dwRepeat, WPARAM wParam) { //锁定资源 CThreadLockHandle LockHandle(&m_ThreadLock); //效验参数 ASSERT(dwRepeat>0L); if (dwRepeat==0) return false; dwElapse=(dwElapse+m_dwTimerSpace-1)/m_dwTimerSpace*m_dwTimerSpace; //查找定时器 bool bTimerExist=false; tagTimerItem * pTimerItem=NULL; for (INT_PTR i=0;i<m_TimerItemActive.GetCount();i++) { pTimerItem=m_TimerItemActive[i]; ASSERT(pTimerItem!=NULL); if (pTimerItem->wTimerID==wTimerID) { bTimerExist=true; break; } } //创建定时器 if (bTimerExist==false) { INT_PTR nFreeCount=m_TimerItemFree.GetCount(); if (nFreeCount>0) { pTimerItem=m_TimerItemFree[nFreeCount-1]; ASSERT(pTimerItem!=NULL); m_TimerItemFree.RemoveAt(nFreeCount-1); } else { try { pTimerItem=new tagTimerItem; ASSERT(pTimerItem!=NULL); if (pTimerItem==NULL) return false; } catch (...) { return false; } } } //设置参数 ASSERT(pTimerItem!=NULL); pTimerItem->wTimerID=wTimerID; pTimerItem->wBindParam=wParam; pTimerItem->dwElapse=dwElapse; pTimerItem->dwRepeatTimes=dwRepeat; pTimerItem->dwTimeLeave=dwElapse+m_dwTimePass; //激活定时器 m_dwTimeLeave=__min(m_dwTimeLeave,dwElapse); if (bTimerExist==false) m_TimerItemActive.Add(pTimerItem); return false; }
//删除定时器 bool __cdecl CTimerEngine::KillTimer(WORD wTimerID) { //锁定资源 CThreadLockHandle LockHandle(&m_ThreadLock); //查找定时器 tagTimerItem * pTimerItem=NULL; for (INT_PTR i=0;i<m_TimerItemActive.GetCount();i++) { pTimerItem=m_TimerItemActive[i]; ASSERT(pTimerItem!=NULL); if (pTimerItem->wTimerID==wTimerID) { m_TimerItemActive.RemoveAt(i); m_TimerItemFree.Add(pTimerItem); if (m_TimerItemActive.GetCount()==0) { m_dwTimePass=0L; m_dwTimeLeave=NO_TIME_LEFT; } return true;; } } return false; }
static void showXlate() { int len; char far* cp; char far* xmsg; Handle bufferHandle; if (xlate) { if (xmsg = findXlate()) { for (len = 0, cp = xmsg; *cp; cp++, len++) ; // add one for trailing null len++; ResLock(RES_XLATE, curModule, TRUE); LockHandle(xlateHandle); bufferHandle = ResLoad(RES_MEM,len); massageText((char far *)*bufferHandle, xmsg); UnlockHandle(xlateHandle); ResLock(RES_XLATE, curModule, FALSE); } else { bufferHandle = ResLoad(RES_MEM,40); massageText((char far *)*bufferHandle, (char far *)"(translation not found)"); } MonoStr((char far *)*bufferHandle); ResUnLoad(RES_MEM,(uword) bufferHandle); } }
//加入数据 bool __cdecl CQueueService::AddToQueue(WORD wIdentifier, void * const pBuffer, WORD wDataSize) { GT_ASSERT(m_cbThreadCount); CThreadLockHandle LockHandle(&m_ThreadLock); m_DataStorage.AddData(wIdentifier,pBuffer,wDataSize); BYTE n = rand() % m_cbThreadCount; PostQueuedCompletionStatus(m_hCompletionPort[n],wDataSize,(ULONG_PTR)this,NULL); return true; }
//删除定时器 bool CTimerEngine::KillAllTimer() { //锁定资源 CThreadLockHandle LockHandle(&m_ThreadLock); //删除定时器 m_TimerItemFree.insert(m_TimerItemActive.begin(), m_TimerItemActive.end()); m_TimerItemActive.clear(); //设置变量 m_dwTimePass=0L; m_dwTimeLeave=NO_TIME_LEFT; return true; }
//删除定时器 bool __cdecl CTimerEngine::KillAllTimer() { //锁定资源 CThreadLockHandle LockHandle(&m_ThreadLock); //删除定时器 m_TimerItemFree.Append(m_TimerItemActive); m_TimerItemActive.RemoveAll(); //设置变量 m_dwTimePass=0L; m_dwTimeLeave=NO_TIME_LEFT; return true; }
//删除定时器 bool CTimerEngine::KillTimer(WORD wTimerID) { //锁定资源 CThreadLockHandle LockHandle(&m_ThreadLock); //查找定时器 CTimerItemMap::iterator iter = m_TimerItemActive.find(wTimerID); if(iter != m_TimerItemActive.end()) { m_TimerItemFree.insert(std::make_pair(wTimerID,iter->second)); m_TimerItemActive.erase(iter); if(m_TimerItemActive.empty()) { m_dwTimePass=0L; m_dwTimeLeave=NO_TIME_LEFT; } } return false; }
//设置定时器 bool CTimerEngine::SetTimer(WORD wTimerID, DWORD dwElapse, DWORD dwRepeat, WPARAM wParam) { //锁定资源 CThreadLockHandle LockHandle(&m_ThreadLock); //效验参数 ASSERT(dwRepeat>0L); if (dwRepeat==0) return false; dwElapse=(dwElapse+m_dwTimerSpace-1)/m_dwTimerSpace*m_dwTimerSpace; //查找定时器 bool bTimerExist=false; tagTimerItem * pTimerItem=NULL; CTimerItemMap::iterator iter = m_TimerItemActive.find(wTimerID); if(iter != m_TimerItemActive.end()) { pTimerItem = iter->second; ASSERT(pTimerItem!=NULL); if (pTimerItem->wTimerID==wTimerID) { bTimerExist=true; } } //创建定时器 if (bTimerExist==false) { UINT nFreeCount=m_TimerItemFree.size(); if (nFreeCount>0) { pTimerItem=m_TimerItemFree.begin()->second; ASSERT(pTimerItem!=NULL); m_TimerItemFree.erase(m_TimerItemFree.begin()); } else { try { pTimerItem=new tagTimerItem; ASSERT(pTimerItem!=NULL); if (pTimerItem==NULL) return false; } catch (...) { return false; } } } //设置参数 ASSERT(pTimerItem!=NULL); pTimerItem->wTimerID=wTimerID; pTimerItem->wBindParam=wParam; pTimerItem->dwElapse=dwElapse; pTimerItem->dwRepeatTimes=dwRepeat; pTimerItem->dwTimeLeave=dwElapse+m_dwTimePass; //激活定时器 m_dwTimeLeave=__min(m_dwTimeLeave,dwElapse); if (bTimerExist==false) { m_TimerItemActive.insert(std::make_pair(wTimerID, pTimerItem)); return true; } return false; }
//定时器通知 void CTimerEngine::OnTimerThreadSink() { //锁定资源 CThreadLockHandle LockHandle(&m_ThreadLock); //倒计时间 if (m_dwTimeLeave==NO_TIME_LEFT) { ASSERT(m_TimerItemActive.size()==0); return; } //减少时间 ASSERT(m_dwTimeLeave>=m_dwTimerSpace); m_dwTimeLeave-=m_dwTimerSpace; m_dwTimePass+=m_dwTimerSpace; //查询定时器 if (m_dwTimeLeave==0) { bool bKillTimer=false; tagTimerItem * pTimerItem=NULL; DWORD dwTimeLeave=NO_TIME_LEFT; for (CTimerItemMap::iterator iter = m_TimerItemActive.begin(); iter != m_TimerItemActive.end();) { //效验参数 pTimerItem=iter->second; ASSERT(pTimerItem!=NULL); ASSERT(pTimerItem->dwTimeLeave>=m_dwTimePass); //定时器处理 bKillTimer=false; pTimerItem->dwTimeLeave-=m_dwTimePass; if (pTimerItem->dwTimeLeave==0L) { //发送通知 m_AttemperEvent.PostTimerEvent(pTimerItem->wTimerID,pTimerItem->wBindParam); //设置次数 if (pTimerItem->dwRepeatTimes!=INFINITE) { ASSERT(pTimerItem->dwRepeatTimes>0); if (pTimerItem->dwRepeatTimes==1L) { bKillTimer=true; iter = m_TimerItemActive.erase(iter); m_TimerItemFree.insert(std::make_pair(pTimerItem->wTimerID,pTimerItem)); } else pTimerItem->dwRepeatTimes--; } //设置时间 if (bKillTimer==false) pTimerItem->dwTimeLeave=pTimerItem->dwElapse; } //增加索引 if (bKillTimer==false) { ++iter; dwTimeLeave=__min(dwTimeLeave,pTimerItem->dwTimeLeave); ASSERT(dwTimeLeave%m_dwTimerSpace==0); } } //设置响应 m_dwTimePass=0L; m_dwTimeLeave=dwTimeLeave; } }
//提取数据 bool CQueueService::GetData(tagDataHead & DataHead, void * pBuffer, WORD wBufferSize) { CThreadLockHandle LockHandle(&m_ThreadLock); return m_DataStorage.GetData(DataHead,pBuffer,wBufferSize); }
//负荷信息 bool __cdecl CQueueService::GetBurthenInfo(tagBurthenInfo & BurthenInfo) { CThreadLockHandle LockHandle(&m_ThreadLock); return m_DataStorage.GetBurthenInfo(BurthenInfo); }
global bool InitSoundDriver() { int patchNum; Handle patchHandle; /* Load sound driver */ #ifdef IBM if((soundDrv = LoadHandle(soundDriver)) == (Handle)NULL) { RAlert(E_CANT_FIND, soundDriver); return (FALSE); } LockHandle(soundDrv); #endif #ifdef AMIGA if(!(bseg = (struct Segment *) LoadSeg(soundDriver))) { RAlert(E_CANT_FIND, soundDriver); return (FALSE); } drvHandle = (unsigned char far *) (((ulong) bseg << 2) + 4); soundDrv = (Handle) &drvHandle; if((DoSound(SPatchReq,(void far *) *(soundDrv), (int far *) &numberOfVoices, (int far *) &numberOfDACs, (int far *) &devID) & 0x7f) == 5) { if(dummysoundbank) { int bankFile; long bankIndex = 0, bankSize; if((bankFile = open("patch.005")) == NULL) { RAlert(E_NO_PATCH); return (FALSE); } read(bankFile,&bankSize,2); bankSize = dsoundsize; while(bankSize > 1024) { read(bankFile,(dummysoundbank + bankIndex),1024); bankSize -= 1024; bankIndex += 1024; } if(bankSize) { read(bankFile,(dummysoundbank + bankIndex),bankSize); } close(bankFile); } else { UnLoadSeg(bseg); if(!(bseg = (struct Segment *) LoadSeg("amiga3v.drv"))) { RAlert(E_CANT_FIND,soundDriver); return (FALSE); } drvHandle = (unsigned char far *) (((ulong) bseg << 2) + 4); soundDrv = (Handle) &drvHandle; } } else { if(dummysoundbank) { FreeMem(dummysoundbank,dsoundsize); dummysoundbank = NULL; } } seglist[segcount++] = bseg; #endif /* Load patch (if one is needed) * If bit 7 of the patch number is set, then the patch * will need to be locked permanently in hunk */ patchNum = DoSound(SPatchReq,(void far *) *(soundDrv), (int far *) &numberOfVoices, (int far *) &numberOfDACs, (int far *) &devID); #ifdef AMIGA if((patchNum & 0x7f) == 5) { /* This Kludge is temporary, until */ patchNum = -1; /* the Amiga interpreter is capable of*/ } /* handling 64k+ resources */ #endif if(patchNum != -1) { if ((patchNum&0x7f) == 10) patchHandle = DoLoad(RES_PATCH,(patchNum & 0x7f)); else patchHandle = ResLoad(RES_PATCH,(patchNum & 0x7f)); if(patchNum & 0x80) { ResLock(RES_PATCH,(patchNum & 0x7f),TRUE); LockHandle(patchHandle); } } /* Initialize sound driver */ #ifdef IBM if(DoSound(SInit,(char far *) *(patchHandle),0) == -1) { DisposeHandle(soundDrv); RAlert(E_NO_MUSIC); return(FALSE); } #endif #ifdef AMIGA if(dummysoundbank) { DoSound(SInit,dummysoundbank); } else { DoSound(SInit,(char far *) *(patchHandle),0); } #endif InitList(&soundList); InstallServer(SoundServer,1); DoSound(SProcess,TRUE); return(TRUE); }
LockHandle scopeLock() { return LockHandle(this); }
//定时器通知 void CTimerEngine::OnTimerThreadSink() { //锁定资源 CThreadLockHandle LockHandle(&m_ThreadLock); //倒计时间 if (m_dwTimeLeave==NO_TIME_LEFT) { ASSERT(m_TimerItemActive.GetCount()==0); return; } //减少时间 ASSERT(m_dwTimeLeave>=m_dwTimerSpace); m_dwTimeLeave-=m_dwTimerSpace; m_dwTimePass+=m_dwTimerSpace; //查询定时器 if (m_dwTimeLeave==0) { bool bKillTimer=false; tagTimerItem * pTimerItem=NULL; DWORD dwTimeLeave=NO_TIME_LEFT; for (INT_PTR i=0;i<m_TimerItemActive.GetCount();) { //效验参数 pTimerItem=m_TimerItemActive[i]; ASSERT(pTimerItem!=NULL); ASSERT(pTimerItem->dwTimeLeave>=m_dwTimePass); //定时器处理 bKillTimer=false; pTimerItem->dwTimeLeave-=m_dwTimePass; if (pTimerItem->dwTimeLeave==0L) { //发送通知 m_AttemperEvent.PostTimerEvent(pTimerItem->wTimerID,pTimerItem->wBindParam); //设置次数 if (pTimerItem->dwRepeatTimes!=TIMER_REPEAT_TIMER) { ASSERT(pTimerItem->dwRepeatTimes>0); if (pTimerItem->dwRepeatTimes==1L) { bKillTimer=true; m_TimerItemActive.RemoveAt(i); m_TimerItemFree.Add(pTimerItem); } else pTimerItem->dwRepeatTimes--; } //设置时间 if (bKillTimer==false) pTimerItem->dwTimeLeave=pTimerItem->dwElapse; } //增加索引 if (bKillTimer==false) { i++; dwTimeLeave=__min(dwTimeLeave,pTimerItem->dwTimeLeave); ASSERT(dwTimeLeave%m_dwTimerSpace==0); } } //设置响应 m_dwTimePass=0L; m_dwTimeLeave=dwTimeLeave; } return; }