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:
Vadim Zeitlin
2002-08-20 22:33:55 +00:00
parent 411165f3f4
commit 7ca528cb60

View File

@@ -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();
}