Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister
 
PerlMonks  

comment on

( [id://3333]=superdoc: print w/replies, xml ) Need Help??
In my wxPerl based application, I need to launch and communicate (both its output and its input, stdin) with a shell scripted application (I also wrote).

in the event handler for the start button, we spin off a thread threads->create(\&routine), and it handles all the work.

uses open3 to start the child process, and reads its output (stdout & err) handles to get the console output and put it in a wxPerl textcontrol in a while(<HIS_OUT>) loop.

all works great.. up to the point the child issues a read

now I need to put up a dialog box to get content from the user and then write the response back to the child process.

per the Wx::Thread doc on CPAN http://search.cpan.org/~mbarbon/Wx-0.9701/lib/Wx/Thread.pod I have setup a EVT_COMMAND event handler.
Wx::Event::EVT_COMMAND($panel, -1, $ID_OUR_EVENT, \&ourHandler +) sub ourHandler { my( $frame, $event ) = @_; my $text = $event->GetData; my $textvalue = Wx::GetTextFromUser($text, "some header", wxOK | w +xCANCEL,$self ) ; #---> what to do here with the dialog text. }


and when the data is detected in the subthread

I use
share (my $clientline); # in the main code, referenced here for clari +ty. my $event = new Wx::PlThreadEvent( -1, $ID_OUR_EVENT, $clien +tline); Wx::PostEvent($panel, $event );


to send the event message which causes my handler to fire. all works great. I put up the dialog, get the text from the user..

now I need to write back to the clients stdin ... but it was created in the thread subroutine. like this

local (*HIS_IN ,*HIS_OUT, *HIS_ERR, $childpid); use IPC::Open3; $childpid=open3( *HIS_IN, *HIS_OUT, *HIS_OUT,$command);


and I can write to it successfully in the thread
print HIS_IN $clientline . "\n";


however, I haven't found any way to get the handle from the thread to the main window loop. seems globs are not shareable.

anyone have any ideas?

when I try to use $panel->ProcessEvent() my application crashes with no feedback as soon as the dialog window is started. unlikely it is a stack size problem as the default is 16MB on Windows

on linux the dialog window appears, but then we crash, regardless of ok or cancel. and this is written to the console /usr/libexec/xxx.pl: No such file or directory.

------------------

late breaking update after successfully resolving all my issues, seeking something else wxPerl related, I came across Wx::Perl::ProcessStream, which completely replaces all the threading, open3(), file handle, and inter thread communication issues..

net reduction of complexity..

lines of output from the child process fire subroutines, methods provided to write back..

use Wx::Perl::ProcessStream qw( :everything ); # setup the stream handlers EVT_WXP_PROCESS_STREAM_STDOUT ( wxperl_window, \&evt_process_stdout +_err ); EVT_WXP_PROCESS_STREAM_STDERR ( wxperl_window, \&evt_process_stdout +_err ); EVT_WXP_PROCESS_STREAM_EXIT ( wxperl_window, \&evt_process_exit + ); EVT_WXP_PROCESS_STREAM_MAXLINES ( wxperl_window, \&evt_process_maxlin +es ); the handlers (here both the childs stdout & sterr are handled in the s +ame handler) sub evt_process_stdout_err { my( $self, $event ) = @_; $event->Skip(1); my $process = $event->GetProcess; my $clientline = $event->GetLine; $clientline=~s/"//g; $clientline=~s/\s+$//g; # string off all quotes and trailing whitespace # show it in the test window $detailsInfo->AppendText("$clientline\n"); # if the output line ends with identified line end, then it is abou +t to be a prompt if ($clientline=~m/($specialeol)$/) { my $textvalue = Wx::GetTextFromUser($clientline, "pre exit prom +pt", "",$self) ; $process->WriteProcess("$textvalue\n"); } } sub evt_process_exit { my ($self, $event) = @_; $event->Skip(1); my $process = $event->GetProcess; my $line = $event->GetLine; my @buffers = @{ $process->GetStdOutBuffer }; my @errors = @{ $process->GetStdErrBuffer }; my $exitcode = $process->GetExitCode; $process->Destroy; } the startup (this replaces all the thread goo) my $proc1 = Wx::Perl::ProcessStream::Process->new($command, 's +omelabel', wxperl_window)->Run;

In reply to threads, file handles and wxPerl by sdetweil

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post; it's "PerlMonks-approved HTML":



  • Are you posting in the right place? Check out Where do I post X? to know for sure.
  • Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
    <code> <a> <b> <big> <blockquote> <br /> <dd> <dl> <dt> <em> <font> <h1> <h2> <h3> <h4> <h5> <h6> <hr /> <i> <li> <nbsp> <ol> <p> <small> <strike> <strong> <sub> <sup> <table> <td> <th> <tr> <tt> <u> <ul>
  • Snippets of code should be wrapped in <code> tags not <pre> tags. In fact, <pre> tags should generally be avoided. If they must be used, extreme care should be taken to ensure that their contents do not have long lines (<70 chars), in order to prevent horizontal scrolling (and possible janitor intervention).
  • Want more info? How to link or How to display code and escape characters are good places to start.
Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others learning in the Monastery: (5)
As of 2024-04-18 11:01 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found