2015-07-28 13 views
6

Ich habe eine Subroutine, die normalerweise 1 Sekunde dauert. Manchmal kann es unendlich laufen. Ich möchte im Code weitermachen, wenn das Unterprogramm zu lange dauert (> 10 Sekunden) und den Durchlauf dieses Unterprogramms ignorieren. Hier ist, was ich bisher mit Alarm habe.Perl Unterroutine Timeout

use Win32::OLE; 

eval { 
    local $SIG{ALRM} = sub { die "alarm\n" }; 
    alarm 10;     # schedule alarm in 10 seconds 
    &do_the_subroutine; 
    alarm 0;     # cancel the alarm 
}; 

if ([email protected]) { 
    $error_string .= $script; 
    #Do something else if the subroutine took too long. 
} 

do_the_subroutine{ 
# use existing instance if Excel is already running 
    eval {$ex = Win32::OLE->GetActiveObject('Excel.Application')}; 
    die "Excel not installed" if [email protected]; 
    unless (defined $ex) { 
     $ex = Win32::OLE->new('Excel.Application', sub {$_[0]->Quit;}) 
       or die "Oops, cannot start Excel"; 
    } 

    # get a new workbook 
    $book = $ex->Workbooks->Add; 

    # write to a particular cell 
    $sheet = $book->Worksheets(1); 
    $sheet->Cells(1,1)->{Value} = "foo"; 

    # write a 2 rows by 3 columns range 
    $sheet->Range("A8:C9")->{Value} = [[ undef, 'Xyzzy', 'Plugh' ], 
             [ 42, 'Perl', 3.1415 ]]; 

    # print "XyzzyPerl" 
    $array = $sheet->Range("A8:C9")->{Value}; 
    for (@$array) { 
     for (@$_) { 
      print defined($_) ? "$_|" : "<undef>|"; 
     } 
     print "\n"; 
    } 

    # save and exit 
    $book->SaveAs('test.xls'); 
    undef $book; 
    undef $ex; 
} 

& do_the_subroutine nie so kehrt Ich bin zu bewegen nicht in der Lage. Ich bin auch nicht in der Lage, diesen Codeblock innerhalb dieser Subroutine zu platzieren. Irgendwelche Gedanken?

+0

Können Sie den Code des Unterprogramms teilen? Es funktioniert gut für mich, siehe diese Demo: http://ideone.com/KycD4S –

+0

Ich kann nicht scheinen, dieses Verhalten neu zu erstellen, den gleichen Code benutzend sehe ich den Alarm ausgeht. Gibt es mehr Code, den wir hier nicht sehen? Können Sie die Definition von 'do_the_subroutine' anzeigen? –

+0

Hallo, ich habe die Definition hinzugefügt. – ansario

Antwort

4

Ich vermute, dass was Sie wollen, ist einfach nicht nativ mit alarm unter Windows möglich.

Von perldoc perlport:

Alarm emulierten mit Timer, die explizit abgefragt werden müssen, wenn Perl will „sichere Signale“ und kann daher nicht versenden Interrupt-System Anrufe zu blockieren. (Win32)

+0

Danke dafür! – ansario

+1

Dachte, es könnte so etwas sein. Gut gemacht für das Graben :) – Sobrique

+0

Ah 'perlport' !! –