Ejemplo n.º 1
0
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);
		}
}
Ejemplo n.º 2
0
//设置定时器
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;
}
Ejemplo n.º 3
0
//删除定时器
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;
}
Ejemplo n.º 4
0
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);
    }
}
Ejemplo n.º 5
0
//加入数据
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;
}
Ejemplo n.º 6
0
//删除定时器
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;
}
Ejemplo n.º 7
0
//删除定时器
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;
}
Ejemplo n.º 8
0
//删除定时器
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;
}
Ejemplo n.º 9
0
//设置定时器
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;
}
Ejemplo n.º 10
0
//定时器通知
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;
    }
}
Ejemplo n.º 11
0
//提取数据
bool CQueueService::GetData(tagDataHead & DataHead, void * pBuffer, WORD wBufferSize)
{
	CThreadLockHandle LockHandle(&m_ThreadLock);
	return m_DataStorage.GetData(DataHead,pBuffer,wBufferSize);
}
Ejemplo n.º 12
0
//负荷信息
bool __cdecl CQueueService::GetBurthenInfo(tagBurthenInfo & BurthenInfo)
{
	CThreadLockHandle LockHandle(&m_ThreadLock);
	return m_DataStorage.GetBurthenInfo(BurthenInfo);
}
Ejemplo n.º 13
0
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);
}
Ejemplo n.º 14
0
	LockHandle scopeLock() { return LockHandle(this); }
Ejemplo n.º 15
0
//定时器通知
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;
}