Question about behaviour of foreach and Glib:IO-> add_handler
- From: "Mike Martin" <redtux1 googlemail com>
- To: gtk-perl-list gnome org
- Subject: Question about behaviour of foreach and Glib:IO-> add_handler
- Date: Tue, 10 Jun 2008 16:34:32 +0100
Hi
I was always under the impression that a foreach loop iterated over a
list sequentially, which in every other case at least seems to happen.
However I have the following code
sub encode_loop {
my ($opts,$prog,$ext,$sel_opts_vbox)= _;
my $subname='encode';
foreach my $files1 (keys %files){
no strict 'refs';
if (${$files{$files1}}[0] eq $subname){
{
my $prog=&run_cmd($files1,$opts,$prog,$ext,$subname,$sel_opts_vbox) ;
}
}
}
}
Which runs the following sub-routine (abrev) for each file ($files above)
sub run_cmd {
$pid=open($file, "-|","$cmd{$subname} 2>&1") or die "Failed running
perl subprocess\n";
my $end_mark;
my $feedback_type=$options{'feedback'};
if ($feedback_type eq
'1'){$end_mark=$buffer->create_mark('end',$buffer->get_end_iter,0);
$buffer->signal_connect(insert_text=>sub{
$textview->scroll_to_mark($end_mark,0.0,1,0.0,1.0);});
};
our $tag= Glib::IO->add_watch ( fileno($file), ['in', 'hup'], sub {
my ($fileno, $condition,$tag) = @_;
if ($condition eq 'hup') {
close $file;
return 0;
}
my $line ;
sysread $file, $line, 256;
if ($feedback_type eq '0'){
$buffer->insert($buffer->get_end_iter,$line);
$gtkend->set_text($line)
}
else {
$buffer->insert($buffer->get_end_iter, $line);
}
return 1;
}
);
if ($feedback_type eq '1'){
$buffer->signal_connect(insert_text=>sub{
$textview->scroll_to_mark($end_mark,0.0,1,0.0,1.0);});
};
}
However the sub is run for each file in parallel. Anyone have any idea
how to force sequential mode? I suspect that it has something to do
with the buffer/add_watch stuff returning immediately after read.
As this program does video transcoding it would be nice to find a
solution as the times are very long
thanks
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]