note
renegadex
Hi Bulk88,<br>
I have updated my codes and added a queuing system to handle the output chronologically.<br>
I have had problems when sending a single command multiple times at very fast speeds. I have been using this for creating a "live view" for a camera. The previous code was unable to read the output chronologically because of the time it takes for the camera to send a reply. With that I came up with a simple queue system to read all output (depending on the size of the output) and chop the output into lines, and push each line to the array.<br>
Then I have a another sub that reads 1 line from the array, this is being read continuously.<br>
<br>
Sample Code Below<br>
<code>
#!/usr/bin/perl -w
use strict;
use Gtk2 '-init';
use Gtk2::Helper;
use Data::Dumper;
use FileHandle;
use IPC::Open2;
use Win32API::File;
use Win32::API;
my @queue;
{
my $api;
die "PeekNamedPipe"
if ! ($api= Win32::API->Import("kernel32", "
BOOL PeekNamedPipe(
HANDLE hNamedPipe,
LPVOID lpBuffer,
DWORD nBufferSize,
LPDWORD lpBytesRead,
LPDWORD lpTotalBytesAvail,
LPDWORD lpBytesLeftThisMessage
);"));
}
my $wfh = FileHandle->new();
my $rfh = FileHandle->new();
open2($rfh,$wfh,"C:\\Windows\\System32\\cmd.exe");
my $hnd = Win32API::File::FdGetOsFHandle($rfh->fileno());
if($hnd == Win32API::File::INVALID_HANDLE_VALUE()){ die "bad hnd"; }
my $tag = Glib::Timeout->add(10,\&repeat_call);
my $window = Gtk2::Window->new();
$window->signal_connect("destroy",sub{Gtk2->main_quit();});
my $hbox = Gtk2::VBox->new();
$window->add($hbox);
my $button = Gtk2::Button->new("DIR");
$button->signal_connect('clicked'=>sub{
print $wfh "dir\n";
});
$hbox->pack_start($button,0,0,0);
$button = Gtk2::Button->new("TIME");
$button->signal_connect('clicked'=>sub{
print $wfh "time /t\n";
});
$hbox->pack_start($button,0,0,0);
$window->show_all();
Gtk2->main();
sub repeat_call {
my $bAvail = 0;
my $ret = 0;
my $buffer;
$bAvail = "\x00" x 4;
$ret = PeekNamedPipe($hnd,undef,0,undef,$bAvail,undef);
if(!$ret) {
my $err = Win32::GetLastError();
die "PNP failed $err $^E";
}
$bAvail = unpack('L', $bAvail) . "\n";
if($bAvail > 0) {
sysread($rfh,$buffer,$bAvail);
chomp($buffer);
my (@q) = split(/\n/,$buffer);
foreach my $qq (@q){
chomp($qq);
push @queue, $qq;
}
}
action_call();
while (Gtk2->events_pending()) {Gtk2->main_iteration();}
return 1;
}
sub action_call {
my $count = @queue;
if($count){
my $line = shift(@queue);
print $line . "\n";
}
}
</code>
<br>
This is a bit slow, but still does the work! Thanks again for your inputs! BTW I added this as a reference for my blog. Thanks!
<!-- Node text goes above. Div tags should contain sig only -->
<div class="pmsig"><div class="pmsig-697164">
Mabuhay Civil Engineers! :D
</div></div>
1064595
1065029