added wxEventLoop::DispatchTimeout()

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@57571 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2008-12-26 22:28:34 +00:00
parent aa8cbe0b64
commit 9af42efda6
14 changed files with 216 additions and 38 deletions

View File

@@ -99,6 +99,41 @@ bool wxMSWEventLoopBase::GetNextMessage(WXMSG* msg)
return true;
}
int wxMSWEventLoopBase::GetNextMessageTimeout(WXMSG *msg, unsigned long timeout)
{
// MsgWaitForMultipleObjects() won't notice any input which was already
// examined (e.g. using PeekMessage()) but not yet removed from the queue
// so we need to remove any immediately messages manually
//
// NB: using MsgWaitForMultipleObjectsEx() could simplify the code here but
// it is not available in very old Windows versions
if ( !::PeekMessage(msg, 0, 0, 0, PM_REMOVE) )
{
// we use this function just in order to not block longer than the
// given timeout, so we don't pass any handles to it at all
if ( ::MsgWaitForMultipleObjects
(
0, NULL,
FALSE,
timeout,
QS_ALLINPUT
) == WAIT_TIMEOUT )
{
return -1;
}
if ( !::PeekMessage(msg, 0, 0, 0, PM_REMOVE) )
{
wxFAIL_MSG( _T("PeekMessage() should have succeeded") );
return -1;
}
}
return msg->message != WM_QUIT;
}
#endif // wxUSE_BASE
#if wxUSE_GUI
@@ -289,6 +324,18 @@ bool wxGUIEventLoop::Dispatch()
return true;
}
int wxGUIEventLoop::DispatchTimeout(unsigned long timeout)
{
MSG msg;
int rc = GetNextMessageTimeout(&msg, timeout);
if ( rc != 1 )
return rc;
ProcessMessage(&msg);
return 1;
}
void wxGUIEventLoop::OnNextIteration()
{
#if wxUSE_THREADS
@@ -318,22 +365,39 @@ void wxConsoleEventLoop::WakeUp()
#endif
}
void wxConsoleEventLoop::ProcessMessage(WXMSG *msg)
{
if ( msg->message == WM_TIMER )
{
TIMERPROC proc = (TIMERPROC)msg->lParam;
if ( proc )
(*proc)(NULL, 0, msg->wParam, 0);
}
else
{
::DispatchMessage(msg);
}
}
bool wxConsoleEventLoop::Dispatch()
{
MSG msg;
if ( !GetNextMessage(&msg) )
return false;
if ( msg.message == WM_TIMER )
{
TIMERPROC proc = (TIMERPROC)msg.lParam;
if ( proc )
(*proc)(NULL, 0, msg.wParam, 0);
}
else
{
::DispatchMessage(&msg);
}
ProcessMessage(&msg);
return !m_shouldExit;
}
int wxConsoleEventLoop::DispatchTimeout(unsigned long timeout)
{
MSG msg;
int rc = GetNextMessageTimeout(&msg, timeout);
if ( rc != 1 )
return rc;
ProcessMessage(&msg);
return !m_shouldExit;
}