use Tk;
use IPC::Open3;
use IO::Handle;
use Win32::Process::Kill;
use threads;
use threads::shared;
use Thread::Queue;
$q=Thread::Queue->new;
$qe=Thread::Queue->new;
unlink('out.txt');
my %font=(-font=>[-family=>'Courier New',-size=>10]);
my %width=(-width=>120);
$pid = open3( \*CHILD_IN, \*CHILD_OUT, \*CHILD_ERR, 'cmd.exe' );
print "pid = $pid\n";
sleep(1);
threads->create(\&handle_child_out)->detach;
threads->create(\&handle_child_err)->detach;
print "threads created\n";
autoflush CHILD_OUT;
autoflush CHILD_ERR;
my %font=(-font=>[-family=>'Courier New',-size=>10]);
my %width=(-width=>118);
my $mw=new MainWindow;
my $entry=$mw->Entry(
%width,
-relief=>'groove',
-borderwidth=>5,
-textvariable=>\$entry_text,
%font
)->pack;
$entry->focus;
$entry->bind('<Key-Return>',\&enter);
my $text=$mw->Scrolled('Text',
-insertontime=>0,
-scrollbars=>'e',
%font,
%width,
-height=>43
)->pack;
my $geom=$mw->geometry;
$geom='+5+5';
$mw->geometry($geom);
$mw->after(500,\&handler);
MainLoop;
Kill($pid);
sub enter
{
print CHILD_IN "$entry_text\n";
$entry_text='';
$entry->focus;
}
sub handler
{
while(($q->pending)||($qe->pending))
{
my ($content,$contente);
if($q->pending)
{
$content=$q->dequeue;
$content=~s/\r//g;
}
if($qe->pending)
{
$contente=$qe->dequeue;
$contente=~s/\r//g;
}
my ($x,$y)=$text->yview();
$text->insert('1.0',"$content$contente");
$text->yview(moveto=>$x);
$entry->focus;
}
$mw->after(500,\&handler);
}
sub handle_child_out
{
sleep(1);
do
{
sysread CHILD_OUT, $content, 4092;
if($content ne '')
{
$q->enqueue($content);
}
}
while(1);
}
sub handle_child_err
{
sleep(1);
do
{
sysread CHILD_ERR, $content, 4092;
if($content ne '')
{
$q->enqueue($content);
}
}
while(1);
}
|