2009-08-12 1 views
1

내부에 별도의 exe를 호출하는 Perl/TK GUI 코드를 만들었습니다. 진행 표시 줄 위젯은 그 안에 실행이 일어나고 있다는 유일한 표시 일뿐입니다. 문제는 코드를 실행하면 진행 상태 표시 줄이 멈춰 있기 때문에 별도의 EXE 실행을 완료해야하고 완료 후에는 진행 상황에 대한 활동입니다. 업데이트 할 수 있습니다.외부 프로세스가 실행 중임을 나타내는 Perl/Tk 진행 표시 줄을 어떻게 만들 수 있습니까?

코드의 실시간 실행을 위해 별도의 exe와 관련하여 진행 상황을 동시에 구현하는 더 좋은 방법이 있습니까?

답변

4

외부 프로그램을 어떻게 부르십니까? system()과 같은 것을 차단하고 있다면 그렇게하지 마십시오. 별도의 프로세스에서 프로그램을 실행 한 다음 폴링하여 실행 중인지 확인하십시오. 실행중인 동안에는 진행률 표시기를 업데이트합니다.

+1

+1. Perl에서 서브 프로세스의 비 차단 실행에 관한 최근 질문을 SO에서 검색하십시오. –

+0

안녕하세요 Brian, system()을 통해 외부 프로그램을 호출합니다. 개념에 대해 자세히 설명해 주시겠습니까? 감사합니다. –

2

다른 프로세스에서 진행률을 출력합니까? 그렇다면 open()을 사용하여 하위 프로세스를 실행할 수 있습니다.

또한 using open() for IPCperlipc 섹션에서 살펴 보셔야합니다
open(MYSUBPROC, '-|', "myprocess args") or die "could not execute!"; 
while (<MYSUBPROC>) 
{ 
    #do something... 
} 
close(MYSUBPROC) || warn "subproc returned error $?"; 

Safe pipe opens

1

나는 빠른 예를 채찍질하기에 충분한 펄/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: $?";