348 lines
9.3 KiB
Plaintext
348 lines
9.3 KiB
Plaintext
WORD MessageQueue::waitMessage(ThreadMessage &someThreadMessage)
|
||
{
|
||
mNamedEvent.waitEvent(INFINITE,mIsAlertable);
|
||
// mNamedEvent.resetEvent();
|
||
mMutexSemaphore.requestMutex();
|
||
if(isQueueEmpty()){mMutexSemaphore.releaseMutex();mNamedEvent.resetEvent();return FALSE;}
|
||
getQueueMessage(someThreadMessage);
|
||
mMutexSemaphore.releaseMutex();
|
||
return TRUE;
|
||
}
|
||
|
||
WORD MessageQueue::getQueueMessage(ThreadMessage &someThreadMessage)
|
||
{
|
||
if(isQueueEmpty())return FALSE;
|
||
|
||
if(mMessageQueueHigh.size())
|
||
{
|
||
someThreadMessage=mMessageQueueHigh[0];
|
||
mMessageQueueHigh.remove(0L);
|
||
// someThreadMessage=mMessageQueueHigh[mMessageQueueHigh.size()-1];
|
||
// mMessageQueueHigh.remove(mMessageQueueHigh.size()-1);
|
||
}
|
||
else if(mMessageQueueNormal.size())
|
||
{
|
||
someThreadMessage=mMessageQueueNormal[0];
|
||
mMessageQueueNormal.remove(0L);
|
||
// someThreadMessage=mMessageQueueNormal[mMessageQueueNormal.size()-1];
|
||
// mMessageQueueNormal.remove(mMessageQueueNormal.size()-1);
|
||
}
|
||
else
|
||
{
|
||
someThreadMessage=mMessageQueueLow[0];
|
||
mMessageQueueLow.remove(0L);
|
||
// someThreadMessage=mMessageQueueLow[mMessageQueueLow.size()-1];
|
||
// mMessageQueueLow.remove(mMessageQueueLow.size()-1);
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
WORD PureThread::start(LPVOID lpCreationData)
|
||
{
|
||
if(isOkay()||!mlpfnThreadProc)return FALSE;
|
||
mhThread=::CreateThread((SECURITY_ATTRIBUTES*)0,InitialStack,mlpfnThreadProc,lpCreationData,CREATE_SUSPENDED,&mThreadID);
|
||
mhThread=::
|
||
if(!mhThread)return FALSE;
|
||
mThreadStatus=InSuspend;
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
unsigned long _beginthread( void( __cdecl *start_address )( void * ), unsigned stack_size, void *arglist );
|
||
unsigned long _beginthreadex( void *security, unsigned stack_size, unsigned ( __stdcall *start_address )( void * ), void *arglist, unsigned initflag, unsigned *thrdaddr );
|
||
Routine
|
||
Required Header
|
||
Optional Headers
|
||
Compatibility
|
||
_beginthread
|
||
<process.h>
|
||
Win 95, Win NT
|
||
_beginthreadex
|
||
<process.h>
|
||
Win 95, Win NT
|
||
For additional compatibility information, see Compatibility in the Introduction.
|
||
Libraries
|
||
LIBCMT.LIB
|
||
Multithread static library, retail version
|
||
MSVCRT.LIB
|
||
Import library for MSVCRTx0.DLL, retail version
|
||
MSVCRTx0.DLL
|
||
Multithread DLL library, retail version
|
||
To use _beginthread or _beginthreadex, the application must link with one of the multithreaded C run-time libraries.
|
||
Return Value
|
||
If successful, each of these functions returns a handle to the newly created thread. _beginthread returns –1 on an error, in which case errno is set to EAGAIN if there are too many threads, or to EINVAL if the argument is invalid or the stack size is incorrect. _beginthreadex returns 0 on an error, in which case errno and doserrno are set.
|
||
Parameters
|
||
start_address Start address of routine that begins execution of new thread
|
||
stack_size Stack size for new thread or 0
|
||
arglist Argument list to be passed to new thread or NULL
|
||
security Security descriptor for new thread; must be NULL for Windows 95 applications
|
||
initflag Initial state of new thread (running or suspended)
|
||
thrdaddr Address of new thread
|
||
_CRTIMP unsigned long __cdecl _beginthreadex(void *, unsigned,
|
||
unsigned (__stdcall *) (void *), void *, unsigned, unsigned *);
|
||
|
||
|
||
|
||
|
||
inline
|
||
BOOL Event::isOkay(void)const
|
||
{
|
||
// return mhEvent?TRUE:FALSE;
|
||
return (mhEvent&&WAIT_TIMEOUT==::WaitForSingleObject(mhEvent,0));
|
||
}
|
||
|
||
|
||
|
||
WORD Event::waitEvent(DWORD timeOut,WORD alertable)const
|
||
{
|
||
DWORD waitResult;
|
||
|
||
// if(!mhEvent)return FALSE;
|
||
if(!isOkay())return FALSE;
|
||
waitResult=::WaitForSingleObjectEx(mhEvent,timeOut,alertable);
|
||
if(WAIT_ABANDONED==waitResult)return FALSE;
|
||
else if(WAIT_TIMEOUT==waitResult)return FALSE;
|
||
else if(WAIT_OBJECT_0==waitResult)return TRUE;
|
||
else return TRUE;
|
||
}
|
||
|
||
WORD Event::closeEvent(void)
|
||
{
|
||
// if(!mhEvent)return FALSE;
|
||
if(!isOkay())return FALSE;
|
||
::CloseHandle(mhEvent);
|
||
mhEvent=0;
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
CallbackData::ReturnType TabPage::keyDownHandler(CallbackData &someCallbackData)
|
||
{
|
||
GlobalDefs::outDebug("TabPage::keyDownHandler");
|
||
KeyData keyData(someCallbackData);
|
||
|
||
if(keyData.controlKeyPressed()&&Home==keyData.virtualKey())
|
||
{
|
||
clearUpdate();
|
||
mCurrEntryIndex=0;
|
||
showCurrent();
|
||
}
|
||
else if(keyData.controlKeyPressed()&&End==keyData.virtualKey())
|
||
{
|
||
clearUpdate();
|
||
mCurrEntryIndex=mTabEntries.size()-1;
|
||
showCurrent();
|
||
}
|
||
else if(RightArrow==keyData.virtualKey())
|
||
{
|
||
if(mCurrEntryIndex+1<mTabEntries.size())
|
||
{
|
||
mCurrEntryIndex++;
|
||
clearUpdate();
|
||
showCurrent();
|
||
TabEntry &entry=mTabEntries[mCurrEntryIndex];
|
||
entry.play(mMIDIDevice->getDevice(),false);
|
||
}
|
||
else ::MessageBeep(0);
|
||
}
|
||
else if(LeftArrow==keyData.virtualKey())
|
||
{
|
||
if(mCurrEntryIndex-1>=0)
|
||
{
|
||
mCurrEntryIndex--;
|
||
clearUpdate();
|
||
showCurrent();
|
||
TabEntry &entry=mTabEntries[mCurrEntryIndex];
|
||
entry.play(mMIDIDevice->getDevice(),false);
|
||
}
|
||
else ::MessageBeep(0);
|
||
}
|
||
else if(DownArrow==keyData.virtualKey())
|
||
{
|
||
if(mCurrEntryIndex+mItemsPerTab+1>=mTabEntries.size())mCurrEntryIndex=mTabEntries.size()-1;
|
||
else mCurrEntryIndex+=(mItemsPerTab+1);
|
||
clearUpdate();
|
||
showCurrent();
|
||
TabEntry &entry=mTabEntries[mCurrEntryIndex];
|
||
entry.play(mMIDIDevice->getDevice(),false);
|
||
}
|
||
else if(UpArrow==keyData.virtualKey())
|
||
{
|
||
if(mCurrEntryIndex-(mItemsPerTab+1)<0)mCurrEntryIndex=0;
|
||
else mCurrEntryIndex-=(mItemsPerTab+1);
|
||
clearUpdate();
|
||
showCurrent();
|
||
TabEntry &entry=mTabEntries[mCurrEntryIndex];
|
||
entry.play(mMIDIDevice->getDevice(),false);
|
||
}
|
||
else if(!keyData.shiftKeyPressed()&&Delete==keyData.virtualKey())
|
||
{
|
||
cut();
|
||
}
|
||
else if(!keyData.shiftKeyPressed()&&Insert==keyData.virtualKey()) // insert after current position
|
||
{
|
||
Rect outlineRect;
|
||
TabEntry entry;
|
||
GDIPoint cursorPos;
|
||
|
||
clearUpdate();
|
||
if(!mTabEntries.size())
|
||
{
|
||
mTabEntries.insert(&entry);
|
||
mCurrEntryIndex=0;
|
||
}
|
||
else
|
||
{
|
||
mTabEntries.insertAfter(mCurrEntryIndex,&entry);
|
||
mCurrEntryIndex++;
|
||
}
|
||
if(!getFretEntry())
|
||
{
|
||
mTabEntries.remove(mCurrEntryIndex);
|
||
mCurrEntryIndex--; // smk
|
||
if(mCurrEntryIndex>=mTabEntries.size())mCurrEntryIndex=mTabEntries.size()-1;
|
||
}
|
||
getOutlineRect(mCurrEntryIndex,outlineRect);
|
||
mParent->clientToScreen(outlineRect);
|
||
cursorPos.x(outlineRect.left());
|
||
cursorPos.y(outlineRect.top());
|
||
::SetCursorPos(cursorPos.x(),cursorPos.y());
|
||
|
||
/* Rect outlineRect;
|
||
GDIPoint cursorPos;
|
||
|
||
::GetCursorPos(&cursorPos.getPOINT());
|
||
clearUpdate();
|
||
mTabEntries.insert(&TabEntry());
|
||
mCurrEntryIndex=mTabEntries.size()-1;
|
||
if(!getFretEntry())
|
||
{
|
||
mTabEntries.remove(mCurrEntryIndex);
|
||
if(mCurrEntryIndex>=mTabEntries.size())mCurrEntryIndex=mTabEntries.size()-1;
|
||
}
|
||
clearUpdate();
|
||
showCurrent();
|
||
getOutlineRect(mCurrEntryIndex,outlineRect);
|
||
mParent->clientToScreen(outlineRect);
|
||
cursorPos.x(outlineRect.left());
|
||
::SetCursorPos(cursorPos.x(),cursorPos.y()); */
|
||
}
|
||
else if(keyData.shiftKeyPressed()&&Insert==keyData.virtualKey()) // insert at end
|
||
{
|
||
|
||
|
||
Rect outlineRect;
|
||
GDIPoint cursorPos;
|
||
|
||
// ::GetCursorPos(&cursorPos.getPOINT());
|
||
clearUpdate();
|
||
mTabEntries.insert(&TabEntry());
|
||
mCurrEntryIndex=mTabEntries.size()-1;
|
||
if(!getFretEntry())
|
||
{
|
||
mCurrEntryIndex--;
|
||
mTabEntries.remove(mCurrEntryIndex);
|
||
if(mCurrEntryIndex>=mTabEntries.size())mCurrEntryIndex=mTabEntries.size()-1;
|
||
}
|
||
clearUpdate();
|
||
showCurrent();
|
||
getOutlineRect(mCurrEntryIndex,outlineRect);
|
||
mParent->clientToScreen(outlineRect);
|
||
cursorPos.x(outlineRect.left());
|
||
cursorPos.y(outlineRect.top());
|
||
::SetCursorPos(cursorPos.x(),cursorPos.y());
|
||
|
||
|
||
/* Rect outlineRect;
|
||
TabEntry entry;
|
||
GDIPoint cursorPos;
|
||
|
||
::GetCursorPos(&cursorPos.getPOINT());
|
||
clearUpdate();
|
||
if(!mTabEntries.size())
|
||
{
|
||
mTabEntries.insert(&entry);
|
||
mCurrEntryIndex=0;
|
||
}
|
||
else
|
||
{
|
||
mTabEntries.insertAfter(mCurrEntryIndex,&entry);
|
||
mCurrEntryIndex++;
|
||
}
|
||
if(!getFretEntry())
|
||
{
|
||
mTabEntries.remove(mCurrEntryIndex);
|
||
if(mCurrEntryIndex>=mTabEntries.size())mCurrEntryIndex=mTabEntries.size()-1;
|
||
}
|
||
getOutlineRect(mCurrEntryIndex,outlineRect);
|
||
mParent->clientToScreen(outlineRect);
|
||
cursorPos.x(outlineRect.left());
|
||
::SetCursorPos(cursorPos.x(),cursorPos.y()); */
|
||
}
|
||
GlobalDefs::outDebug(String("Key Code=")+String().fromInt(keyData.virtualKey()));
|
||
return false;
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
else if(keyData.shiftKeyPressed()&&Insert==keyData.virtualKey()) // insert at end
|
||
{
|
||
|
||
|
||
Rect outlineRect;
|
||
GDIPoint cursorPos;
|
||
|
||
// ::GetCursorPos(&cursorPos.getPOINT());
|
||
clearUpdate();
|
||
mTabEntries.insert(&TabEntry());
|
||
mCurrEntryIndex=mTabEntries.size()-1;
|
||
if(!getFretEntry())
|
||
{
|
||
mCurrEntryIndex--;
|
||
mTabEntries.remove(mCurrEntryIndex);
|
||
if(mCurrEntryIndex>=mTabEntries.size())mCurrEntryIndex=mTabEntries.size()-1;
|
||
}
|
||
clearUpdate();
|
||
showCurrent();
|
||
getOutlineRect(mCurrEntryIndex,outlineRect);
|
||
mParent->clientToScreen(outlineRect);
|
||
cursorPos.x(outlineRect.left());
|
||
cursorPos.y(outlineRect.top());
|
||
::SetCursorPos(cursorPos.x(),cursorPos.y());
|
||
|
||
|
||
/* Rect outlineRect;
|
||
TabEntry entry;
|
||
GDIPoint cursorPos;
|
||
|
||
::GetCursorPos(&cursorPos.getPOINT());
|
||
clearUpdate();
|
||
if(!mTabEntries.size())
|
||
{
|
||
mTabEntries.insert(&entry);
|
||
mCurrEntryIndex=0;
|
||
}
|
||
else
|
||
{
|
||
mTabEntries.insertAfter(mCurrEntryIndex,&entry);
|
||
mCurrEntryIndex++;
|
||
}
|
||
if(!getFretEntry())
|
||
{
|
||
mTabEntries.remove(mCurrEntryIndex);
|
||
if(mCurrEntryIndex>=mTabEntries.size())mCurrEntryIndex=mTabEntries.size()-1;
|
||
}
|
||
getOutlineRect(mCurrEntryIndex,outlineRect);
|
||
mParent->clientToScreen(outlineRect);
|
||
cursorPos.x(outlineRect.left());
|
||
::SetCursorPos(cursorPos.x(),cursorPos.y()); */
|
||
} |