From 7ca528cb60e865ad7bf5b7800c944d0b3af47a79 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Tue, 20 Aug 2002 22:33:55 +0000 Subject: [PATCH] test new wxProcess::IsInputAvailable/Opened functions git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@16640 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- samples/exec/exec.cpp | 56 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 49 insertions(+), 7 deletions(-) diff --git a/samples/exec/exec.cpp b/samples/exec/exec.cpp index e59f3f3326..6c66fce221 100644 --- a/samples/exec/exec.cpp +++ b/samples/exec/exec.cpp @@ -165,7 +165,16 @@ protected: void OnClose(wxCloseEvent& event); - void DoSend() { m_out.WriteString(m_textIn->GetValue() + '\n'); DoGet(); } + void OnProcessTerm(wxProcessEvent& event); + + void DoSend() + { + m_out.WriteString(m_textIn->GetValue() + '\n'); + m_textIn->Clear(); + + DoGet(); + } + void DoGet(); private: @@ -303,6 +312,8 @@ BEGIN_EVENT_TABLE(MyPipeFrame, wxFrame) EVT_TEXT_ENTER(-1, MyPipeFrame::OnTextEnter) EVT_CLOSE(MyPipeFrame::OnClose) + + EVT_END_PROCESS(-1, MyPipeFrame::OnProcessTerm) END_EVENT_TABLE() // Create a new application object: this macro will allow wxWindows to create @@ -984,25 +995,29 @@ MyPipeFrame::MyPipeFrame(wxFrame *parent, m_in(*process->GetInputStream()), m_out(*process->GetOutputStream()) { - m_textIn = new wxTextCtrl(this, -1, _T(""), + m_process->SetNextHandler(this); + + wxPanel *panel = new wxPanel(this, -1); + + m_textIn = new wxTextCtrl(panel, -1, _T(""), wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER); - m_textOut = new wxTextCtrl(this, -1, _T("")); + m_textOut = new wxTextCtrl(panel, -1, _T("")); m_textOut->SetEditable(FALSE); wxSizer *sizerTop = new wxBoxSizer(wxVERTICAL); sizerTop->Add(m_textIn, 0, wxGROW | wxALL, 5); wxSizer *sizerBtns = new wxBoxSizer(wxHORIZONTAL); - sizerBtns->Add(new wxButton(this, Exec_Btn_Send, _T("&Send")), 0, + sizerBtns->Add(new wxButton(panel, Exec_Btn_Send, _T("&Send")), 0, wxALL, 10); - sizerBtns->Add(new wxButton(this, Exec_Btn_Get, _T("&Get")), 0, + sizerBtns->Add(new wxButton(panel, Exec_Btn_Get, _T("&Get")), 0, wxALL, 10); sizerTop->Add(sizerBtns, 0, wxCENTRE | wxALL, 5); sizerTop->Add(m_textOut, 0, wxGROW | wxALL, 5); - SetSizer(sizerTop); + panel->SetSizer(sizerTop); sizerTop->Fit(this); Show(); @@ -1010,13 +1025,40 @@ MyPipeFrame::MyPipeFrame(wxFrame *parent, void MyPipeFrame::DoGet() { + // we don't have any way to be notified when any input appears on the + // stream so we have to poll it :-( + // + // NB: this really must be done because otherwise the other program might + // not have enough time to receive or process our data and we'd read + // an empty string + while ( !m_process->IsInputAvailable() && m_process->IsInputOpened() ) + ; + m_textOut->SetValue(m_in.ReadLine()); } void MyPipeFrame::OnClose(wxCloseEvent& event) { - m_process->CloseOutput(); + if ( m_process ) + { + // we're not interested in getting the process termination notification + // if we are closing it ourselves + wxProcess *process = m_process; + m_process = NULL; + process->SetNextHandler(NULL); + + process->CloseOutput(); + } event.Skip(); } +void MyPipeFrame::OnProcessTerm(wxProcessEvent& event) +{ + delete m_process; + m_process = NULL; + + wxLogWarning(_T("The other process has terminated, closing")); + + Close(); +} -- 2.45.2