]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/evtloopcmn.cpp
use DispatchTimeout() and/or select() with timeout instead of polling loop in wxSocke...
[wxWidgets.git] / src / common / evtloopcmn.cpp
index 711ada6006e6a85bd01a915140d665171db357a5..997718b44aedca26bf9b428d18a31e39f8084a5d 100644 (file)
 // globals
 // ----------------------------------------------------------------------------
 
 // globals
 // ----------------------------------------------------------------------------
 
-wxEventLoop *wxEventLoopBase::ms_activeLoop = NULL;
+wxEventLoopBase *wxEventLoopBase::ms_activeLoop = NULL;
 
 // wxEventLoopManual is unused in the other ports
 
 // wxEventLoopManual is unused in the other ports
-#if defined(__WXMSW__) || defined(__WXMAC__) || defined(__WXDFB__)
+#if defined(__WXMSW__) || defined(__WXMAC__) || defined(__WXDFB__) || (defined(__UNIX__) && wxUSE_BASE)
 
 // ============================================================================
 // wxEventLoopManual implementation
 
 // ============================================================================
 // wxEventLoopManual implementation
@@ -57,7 +57,7 @@ int wxEventLoopManual::Run()
     // ProcessIdle() and Dispatch() below may throw so the code here should
     // be exception-safe, hence we must use local objects for all actions we
     // should undo
     // ProcessIdle() and Dispatch() below may throw so the code here should
     // be exception-safe, hence we must use local objects for all actions we
     // should undo
-    wxEventLoopActivator activate(wx_static_cast(wxEventLoop *, this));
+    wxEventLoopActivator activate(this);
 
     // we must ensure that OnExit() is called even if an exception is thrown
     // from inside Dispatch() but we must call it from Exit() in normal
 
     // we must ensure that OnExit() is called even if an exception is thrown
     // from inside Dispatch() but we must call it from Exit() in normal
@@ -153,3 +153,23 @@ void wxEventLoopManual::Exit(int rc)
 }
 
 #endif // __WXMSW__ || __WXMAC__ || __WXDFB__
 }
 
 #endif // __WXMSW__ || __WXMAC__ || __WXDFB__
+
+#ifdef wxNEEDS_GENERIC_DISPATCH_TIMEOUT
+
+int wxGUIEventLoop::DispatchTimeout(unsigned long timeout)
+{
+    // TODO: this is, of course, horribly inefficient and a proper wait with
+    //       timeout should be implemented for all ports natively...
+    const wxMilliClock_t timeEnd = wxGetLocalTimeMillis() + timeout;
+    for ( ;; )
+    {
+        if ( Pending() )
+            return Dispatch();
+
+        if ( wxGetLocalTimeMillis() >= timeEnd )
+            return -1;
+    }
+}
+
+#endif // wxNEEDS_GENERIC_DISPATCH_TIMEOUT
+