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('',\&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); }