示例#1
0
bool wxAppConsoleBase::HasPendingEvents() const
{
    wxENTER_CRIT_SECT(const_cast<wxAppConsoleBase*>(this)->m_handlersWithPendingEventsLocker);

    bool has = !m_handlersWithPendingEvents.IsEmpty();

    wxLEAVE_CRIT_SECT(const_cast<wxAppConsoleBase*>(this)->m_handlersWithPendingEventsLocker);

    return has;
}
示例#2
0
void wxAppConsoleBase::ProcessPendingEvents()
{
    if (!m_bDoPendingEventProcessing)
        return;

    wxENTER_CRIT_SECT(m_handlersWithPendingEventsLocker);

    wxCHECK_RET( m_handlersWithPendingDelayedEvents.IsEmpty(),
                 "this helper list should be empty" );

    // iterate until the list becomes empty: the handlers remove themselves
    // from it when they don't have any more pending events
    while (!m_handlersWithPendingEvents.IsEmpty())
    {
        // In ProcessPendingEvents(), new handlers might be added
        // and we can safely leave the critical section here.
        wxLEAVE_CRIT_SECT(m_handlersWithPendingEventsLocker);

        // NOTE: we always call ProcessPendingEvents() on the first event handler
        //       with pending events because handlers auto-remove themselves
        //       from this list (see RemovePendingEventHandler) if they have no
        //       more pending events.
        m_handlersWithPendingEvents[0]->ProcessPendingEvents();

        wxENTER_CRIT_SECT(m_handlersWithPendingEventsLocker);
    }

    // now the wxHandlersWithPendingEvents is surely empty; however some event
    // handlers may have moved themselves into wxHandlersWithPendingDelayedEvents
    // because of a selective wxYield call in progress.
    // Now we need to move them back to wxHandlersWithPendingEvents so the next
    // call to this function has the chance of processing them:
    if (!m_handlersWithPendingDelayedEvents.IsEmpty())
    {
        WX_APPEND_ARRAY(m_handlersWithPendingEvents, m_handlersWithPendingDelayedEvents);
        m_handlersWithPendingDelayedEvents.Clear();
    }

    wxLEAVE_CRIT_SECT(m_handlersWithPendingEventsLocker);
}
示例#3
0
void wxAppConsoleBase::DelayPendingEventHandler(wxEvtHandler* toDelay)
{
    wxENTER_CRIT_SECT(m_handlersWithPendingEventsLocker);

    // move the handler from the list of handlers with processable pending events
    // to the list of handlers with pending events which needs to be processed later
    m_handlersWithPendingEvents.Remove(toDelay);

    if (m_handlersWithPendingDelayedEvents.Index(toDelay) == wxNOT_FOUND)
        m_handlersWithPendingDelayedEvents.Add(toDelay);

    wxLEAVE_CRIT_SECT(m_handlersWithPendingEventsLocker);
}
示例#4
0
void wxAppConsoleBase::DeletePendingEvents()
{
    wxENTER_CRIT_SECT(m_handlersWithPendingEventsLocker);

    wxCHECK_RET( m_handlersWithPendingDelayedEvents.IsEmpty(),
                 "this helper list should be empty" );

    for (unsigned int i=0; i<m_handlersWithPendingEvents.GetCount(); i++)
        m_handlersWithPendingEvents[i]->DeletePendingEvents();

    m_handlersWithPendingEvents.Clear();

    wxLEAVE_CRIT_SECT(m_handlersWithPendingEventsLocker);
}
示例#5
0
void wxAppConsole::ProcessPendingEvents()
{
#if wxUSE_THREADS
    if ( !wxPendingEventsLocker )
        return;
#endif
    
    // ensure that we're the only thread to modify the pending events list
    wxENTER_CRIT_SECT( *wxPendingEventsLocker );

    if ( !wxPendingEvents )
    {
        wxLEAVE_CRIT_SECT( *wxPendingEventsLocker );
        return;
    }

    // iterate until the list becomes empty
    wxList::compatibility_iterator node = wxPendingEvents->GetFirst();
    while (node)
    {
        wxEvtHandler *handler = (wxEvtHandler *)node->GetData();
        wxPendingEvents->Erase(node);

        // In ProcessPendingEvents(), new handlers might be add
        // and we can safely leave the critical section here.
        wxLEAVE_CRIT_SECT( *wxPendingEventsLocker );
        
        handler->ProcessPendingEvents();

        wxENTER_CRIT_SECT( *wxPendingEventsLocker );

        node = wxPendingEvents->GetFirst();
    }

    wxLEAVE_CRIT_SECT( *wxPendingEventsLocker );
}
示例#6
0
void wxAppConsoleBase::DeletePendingEvents()
{
    wxENTER_CRIT_SECT(m_handlersWithPendingEventsLocker);

    wxCHECK_RET( m_handlersWithPendingDelayedEvents.IsEmpty(),
                 "this helper list should be empty" );

#if defined(__INTEL_COMPILER) && 1 /* VDM auto patch */
#   pragma ivdep
#   pragma swp
#   pragma unroll
#   pragma prefetch
#   if 0
#       pragma simd noassert
#   endif
#endif /* VDM auto patch */
    for (unsigned int i=0; i<m_handlersWithPendingEvents.GetCount(); i++)
        m_handlersWithPendingEvents[i]->DeletePendingEvents();

    m_handlersWithPendingEvents.Clear();

    wxLEAVE_CRIT_SECT(m_handlersWithPendingEventsLocker);
}