I have a callback which processes a directory of files. The process_file routine typically takes a reasonable amount of time, and is processor-intensive. e.g. sub on_process_dir { my $d = new DirHandle $::settings->{'process_dir'}; if (defined $d) { while (defined($_ = $d->read)) { next if (/^\.\.?$/); next if ($filter and not /$filter/); my $infile = join "/", $::settings->{'process_dir'}, $_; $::widgets->{buffer}->insert($::widgets->{buffer}->get_end_iter, "Processing $infile"); process_file($in_file); } } } I have read the FAQ Q: How do i keep my gui updating while doing a long file read? and added code to the process_infile routine. open ($fh, "perl ./process_signal.pl $input_file $output_file $params |") or die "can't fork"; my $tag = Gtk2::Helper->add_watch($fh->fileno, 'in', sub { if (eof($fh)) { Gtk2::Helper->remove_watch ($tag); close($fh); } else { my $line = <$fh>; $::widgets->{buffer}->insert($::widgets->{buffer}->get_end_iter, $line); } return 1; }); However, it only updated my TextView at the end of the processing. I also discovered, via ps ax, that each file was being processed simultaneously. I was testing with 2 files in the directory - though could imagine problems were I to try to process many files, due to the processor-intensive nature of the processing. The solution of forking n subprocesses isn't scalable. So I would like to be able to process the files sequentially - I have found that if I build a list of files in the callback and pass this to the processing routine, I can effect this, though with the side-effect that the GUI is unresponsive, and the TextView still only updates when all of the files are processed. I would like the TextView to be updated in real time, or at very least, on a file by file basis. I am thinking that I need a more sophisticated approach. I could implement this via the use of the "threads" and "threads::shared" modules. I have also found POE::Loop::Gtk2; I am not however sure of the best approach, so am asking for guidance from any one with experience of using either of these approaches. If I have missed some better way to approach this problem, I would welcome pointers to solutions. Bob -- Generally speaking, the Way of the warrior is resolute acceptance of death. -- Miyamoto Musashi, 1645
Attachment:
signature.asc
Description: Digital signature