如何让Perl / Tk进度条显示外部进程正在运行?

时间:2009-08-12 10:40:23

标签: perl tk

我正在创建一个Perl / TK GUI代码,它将调用单独的exe。进度条小部件将是执行内部发生的唯一指示,但问题是,当您运行代码时,进度条冻结,因为它必须首先完成单独的exe的执行,并在完成后,进度上的活动可以更新。

是否有更好的方法可以同时执行与单独的exe相关的进度,以便实时执行代码?

3 个答案:

答案 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 $?";

您还应该查看perlipcusing open() for IPC

上的Safe pipe opens部分

答案 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: $?";