test new wxProcess::IsInputAvailable/Opened functions
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@16640 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -165,7 +165,16 @@ protected:
|
|||||||
|
|
||||||
void OnClose(wxCloseEvent& event);
|
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();
|
void DoGet();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -303,6 +312,8 @@ BEGIN_EVENT_TABLE(MyPipeFrame, wxFrame)
|
|||||||
EVT_TEXT_ENTER(-1, MyPipeFrame::OnTextEnter)
|
EVT_TEXT_ENTER(-1, MyPipeFrame::OnTextEnter)
|
||||||
|
|
||||||
EVT_CLOSE(MyPipeFrame::OnClose)
|
EVT_CLOSE(MyPipeFrame::OnClose)
|
||||||
|
|
||||||
|
EVT_END_PROCESS(-1, MyPipeFrame::OnProcessTerm)
|
||||||
END_EVENT_TABLE()
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
// Create a new application object: this macro will allow wxWindows to create
|
// 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_in(*process->GetInputStream()),
|
||||||
m_out(*process->GetOutputStream())
|
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,
|
wxDefaultPosition, wxDefaultSize,
|
||||||
wxTE_PROCESS_ENTER);
|
wxTE_PROCESS_ENTER);
|
||||||
m_textOut = new wxTextCtrl(this, -1, _T(""));
|
m_textOut = new wxTextCtrl(panel, -1, _T(""));
|
||||||
m_textOut->SetEditable(FALSE);
|
m_textOut->SetEditable(FALSE);
|
||||||
|
|
||||||
wxSizer *sizerTop = new wxBoxSizer(wxVERTICAL);
|
wxSizer *sizerTop = new wxBoxSizer(wxVERTICAL);
|
||||||
sizerTop->Add(m_textIn, 0, wxGROW | wxALL, 5);
|
sizerTop->Add(m_textIn, 0, wxGROW | wxALL, 5);
|
||||||
|
|
||||||
wxSizer *sizerBtns = new wxBoxSizer(wxHORIZONTAL);
|
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);
|
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);
|
wxALL, 10);
|
||||||
|
|
||||||
sizerTop->Add(sizerBtns, 0, wxCENTRE | wxALL, 5);
|
sizerTop->Add(sizerBtns, 0, wxCENTRE | wxALL, 5);
|
||||||
sizerTop->Add(m_textOut, 0, wxGROW | wxALL, 5);
|
sizerTop->Add(m_textOut, 0, wxGROW | wxALL, 5);
|
||||||
|
|
||||||
SetSizer(sizerTop);
|
panel->SetSizer(sizerTop);
|
||||||
sizerTop->Fit(this);
|
sizerTop->Fit(this);
|
||||||
|
|
||||||
Show();
|
Show();
|
||||||
@@ -1010,13 +1025,40 @@ MyPipeFrame::MyPipeFrame(wxFrame *parent,
|
|||||||
|
|
||||||
void MyPipeFrame::DoGet()
|
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());
|
m_textOut->SetValue(m_in.ReadLine());
|
||||||
}
|
}
|
||||||
|
|
||||||
void MyPipeFrame::OnClose(wxCloseEvent& event)
|
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();
|
event.Skip();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MyPipeFrame::OnProcessTerm(wxProcessEvent& event)
|
||||||
|
{
|
||||||
|
delete m_process;
|
||||||
|
m_process = NULL;
|
||||||
|
|
||||||
|
wxLogWarning(_T("The other process has terminated, closing"));
|
||||||
|
|
||||||
|
Close();
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user