内部で別のexeを呼び出すPerl/TK GUIコードを作成しています。進行状況バー ウィジェットは、内部で実行が行われていることを示す唯一の指標になりますが、問題は、コードを実行すると、最初に別の exe の実行を終了し、完了後に進行状況のアクティビティを終了する必要があるため、進行状況バーがフリーズすることです。更新できます。
コードをリアルタイムで実行するために、別のexeに関して進行状況を同時に実装するより良い方法はありますか?
外部プログラムをどのように呼び出していますか? のようなものでブロックしている場合はsystem()
、そうしないでください。プログラムを別のプロセスで実行し、ポーリングして実行中かどうかを確認します。実行されている限り、進行状況インジケーターを更新します。
他のプロセスから進行状況の出力を取得しますか? その場合はopen()
、サブプロセスを実行するために使用できます。
open(MYSUBPROC, '-|', "myprocess args") or die "could not execute!";
while (<MYSUBPROC>)
{
#do something...
}
close(MYSUBPROC) || warn "subproc returned error $?";
IPCの使用に関するperlipcのセクションも参照してください。また、安全なパイプが開きます。open()
簡単な例を作成するのに十分な Perl/Tk を知りません。
worker.pl
#!/usr/bin/perl
use strict;
use warnings;
$| = 1;
for (0 .. 10) {
print 10 * $_, "\n";
sleep 1;
}
ボス.pl
#!/usr/bin/perl
use strict;
use warnings;
$| = 1;
open my $worker_h, '-|', 'worker.pl'
or die "Cannot open pipe to worker: $!";
while ( my $status = <$worker_h> ) {
chomp $status;
my $ticks = 2 * ($status/10);
print '=' x $ticks, "\r" x $ticks;
# do other stuff;
}
close $worker_h
or die "Error closing pipe to worker: $?";