2012-11-18 3 views
0

result과 같을 때까지 info이 백그라운드에서 실행되도록하려면 어떻게 다시 작성할 수 있습니까?조건이 될 때까지 백그라운드에서 서브 루틴을 실행하십시오.

#!/usr/bin/env perl 
use 5.12.0; 
use warnings; 
use Term::ReadLine; 

my $term = Term::ReadLine->new('something'); 
$term->ornaments(0); 

sub info { 
    # in the real script this runs some computations instead of the sleep 
    # and returns some information. 
    my ($time) = @_; 
    sleep $time; 
    return $time * 2; 
} 

my $value_returned_by_info = info(10); # run this in the background 
my $aw; 

$aw = $term->readline('User input: '); 
if ($aw eq 'result') { 
    # if info() is still running in the background: 
    # wait until info() returns because "$value_returned_by_info" is needed. 
    say $value_returned_by_info; 
} 
else { 
    # if info() is still running in the background: 
    # let info() in the background because "$value_returned_by_info" is not needed here. 
    say $aw; 
} 

$aw = $term->readline('User input: '); 
if ($aw eq 'result') { 
    # if info() is still running in the background: 
    # wait until info() returns because "$value_returned_by_info" is needed. 
    say $value_returned_by_info; 
} 
else { 
    # if info() is still running in the background: 
    # let info() in the background because "$value_returned_by_info" is not needed here. 
    say $aw; 
} 

$aw = $term->readline('User input: '); 
if ($aw eq 'result') { 
    # if info() is still running in the background: 
    # wait until info() returns because "$value_returned_by_info" is needed. 
    say $value_returned_by_info; 
} 
else { 
    # if info() is still running in the background: 
    # let info() in the background because "$value_returned_by_info" is not needed here. 
    say $aw; 
} 

say "End"; 
+0

우리는 메인 프로그램과 상호 작용하는 방법을 당신이 할 수있는'info'을 원하고 무엇에 대한 자세한 정보가 필요. 'info'의'sleep'은 정말로 잠이 들었습니까? 아니면'info'가 주 프로그램과 동시에하고있는 작업을 표현할 수 있습니까? 'info '를 별도의 프로세스에서 실행할 수 있습니까, 아니면'readline' 호출이 실행되는 프로세스와 동일한 프로세스에서 실행해야합니까? 또한,'info'가 값을 반환하기 전에 주 프로그램이'$ result'의 값을 요구하면 어떻게 될까요? 메인 프로그램이 차단되었거나'$ result' 만'undef' 또는 이전 값입니까? – ErikR

+0

수면을 표현하는 것이 있습니다. 정보가 반환되기 전에 주 프로그램이 $ result의 값을 요구하면 정보가 값을 반환 할 때까지 기다려야합니다. –

답변

0

나는 user5402에 동의합니다. 배경 및 수면 정보 기능에서 실행되는 언급은 많은 질문을 제기합니다.

주어진 입력이 올바르지 않을 때 입력을 다시 프롬프트하는 좀 더 깔끔한 방법을 찾고 있는지 궁금합니다. 그렇다면 IO :: Prompter 모듈이 도움이 될 수 있습니다. info는 별도의 프로세스에서 실행 할 수있는 경우

#!/usr/bin/env perl 

use 5.10.0; 
use strict; 
use warnings; 
use IO::Prompter; 

sub info { 
    my ($time) = @_; 
    sleep $time; 
    return $time * 2; 
} 

my $expect = info(10); 
my $aw; 

PROMPT: 
{ 
    $aw = IO::Prompter::prompt('Enter number', -i); 

    if ($aw eq $expect) { 

     say "$aw :)"; 
    } 
    else { 

     say "$aw :("; 

     redo PROMPT; 
    } 
} 

say "End"; 
0

다음은 fork를 사용할 수 있습니다. 그렇지 않으면 perl의 스레드 버전을 사용해야 할 것입니다. fork를 사용

예 :

sub start_info { 
    my @params = @_; 
    my $pipe; 
    my $pid = open($pipe, "-|"); 

    if (!$pid) { 
    # this code will run in a sub-process 
    # compute $result from @params 
    # and print result to STDOUT 
    sleep(10); 
    my $result = "p = $params[0] - pid $$"; 
    print $result; 
    exit(0); 
    }; 

    my $r; 
    return sub { 
    return $r if defined($r); 
    $r = <$pipe>; # read a single line 
    waitpid $pid, 0; 
    $r; 
    }; 
} 

sub prompt { 
    print "Hit return: "; 
    <STDIN>; 
} 

my $info1 = start_info(4); 
prompt(); 
print "result = ", $info1->(), "\n"; 

my $info2 = start_info(30); 
prompt(); 
print "result = ", $info2->(), "\n"; 
+0

이것은 내가 필요한 것이 아닙니다. –

+0

그러면 도움을 얻으려면 무엇이 필요한지 더 분명히해야합니다. – ErikR

+0

예를 편집했습니다. 나에게 문제는 분명해 그래서 내가 할 수있는 말을 모른다. –

관련 문제