我正在创建一个Perl / TK GUI代码,它将调用单独的exe。进度条小部件将是执行内部发生的唯一指示,但问题是,当您运行代码时,进度条冻结,因为它必须首先完成单独的exe的执行,并在完成后,进度上的活动可以更新。
是否有更好的方法可以同时执行与单独的exe相关的进度,以便实时执行代码?
答案 0 :(得分:4)
你是如何打电话给外部程序的?如果您阻止system()
之类的内容,请不要这样做。在一个单独的进程中运行该程序,然后轮询以检查它是否正在运行。只要它正在运行,您就会更新进度指示器。
答案 1 :(得分:2)
您是否从其他流程获得进度输出?如果是这样,您可以使用open()
来运行您的子流程。
open(MYSUBPROC, '-|', "myprocess args") or die "could not execute!";
while (<MYSUBPROC>)
{
#do something...
}
close(MYSUBPROC) || warn "subproc returned error $?";
您还应该查看perlipc和using open()
for IPC
答案 2 :(得分:1)
我不知道Perl / Tk能够提供一个快速的例子。
<强> worker.pl 强>
#!/usr/bin/perl
use strict;
use warnings;
$| = 1;
for (0 .. 10) {
print 10 * $_, "\n";
sleep 1;
}
<强> boss.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: $?";