X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a6eac99d9edb1e8fef08780903827c8bad3f9bff..23a6a62ffa898cd3902339988f3c2ec98c35e332:/src/msw/utilsexc.cpp?ds=sidebyside diff --git a/src/msw/utilsexc.cpp b/src/msw/utilsexc.cpp index f67e0eb11d..5d2e0b52cb 100644 --- a/src/msw/utilsexc.cpp +++ b/src/msw/utilsexc.cpp @@ -38,6 +38,7 @@ #include "wx/process.h" #include "wx/thread.h" #include "wx/apptrait.h" +#include "wx/evtloop.h" #include "wx/vector.h" @@ -217,7 +218,7 @@ protected: protected: HANDLE m_hInput; - DECLARE_NO_COPY_CLASS(wxPipeInputStream) + wxDECLARE_NO_COPY_CLASS(wxPipeInputStream); }; class wxPipeOutputStream: public wxOutputStream @@ -233,7 +234,7 @@ protected: protected: HANDLE m_hOutput; - DECLARE_NO_COPY_CLASS(wxPipeOutputStream) + wxDECLARE_NO_COPY_CLASS(wxPipeOutputStream); }; // define this to let wxexec.cpp know that we know what we're doing @@ -899,6 +900,9 @@ long wxExecute(const wxString& cmd, int flags, wxProcess *handler) { // may be NULL or not data->handler = handler; + + if (handler) + handler->SetPid(pi.dwProcessId); } DWORD tid; @@ -1004,8 +1008,19 @@ long wxExecute(const wxString& cmd, int flags, wxProcess *handler) ::Sleep(50); } - // we must process messages or we'd never get wxWM_PROC_TERMINATED - traits->AlwaysYield(); + // we must always process messages for our hidden window or we'd never + // get wxWM_PROC_TERMINATED and so this loop would never terminate + MSG msg; + ::PeekMessage(&msg, data->hWnd, 0, 0, PM_REMOVE); + + // we may also need to process messages for all the other application + // windows + if ( !(flags & wxEXEC_NOEVENTS) ) + { + wxEventLoopBase * const loop = wxEventLoopBase::GetActive(); + if ( loop ) + loop->Yield(); + } } if ( !(flags & wxEXEC_NODISABLE) )