2015-07-28 13 views
6

Normalde 1 saniye sürecek bir alt yordam var. Bazen, sonsuz olarak çalışabilir. Alt yordam çok uzun sürüyorsa (> 10 saniye) kodda devam etmek istiyorum ve bu alt yordamın çalışmasını görmezden geliyorum. Şimdiye kadar alarmı kullanıyorum.Perl alt yordam zaman aşımı

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 yüzden geçebilirim değilim asla geri gelmez. Bu kod bloğunu da bu alt programın içine koyamıyorum. Düşüncesi olan var mı?

+0

Alt programın kodunu paylaşabilir misiniz? Benim için iyi çalışıyor, bu demo bakın: http://ideone.com/KycD4S –

+0

Bu davranışı yeniden yaratamam, aynı kodu kullanarak alarmın çıktığını görüyorum. Burada görmediğimiz daha fazla kod var mı? 'Do_the_subroutine' tanımını gösterebilir misin? –

+0

Merhaba, tanımı ekledim. – ansario

cevap

4

Yapmak istediğiniz şeyin Windows'da alarm ile doğal olarak mümkün olmadığından şüpheleniyorum. perldoc perlport itibaren

: açıkça sistem çağrıları engelleme kesme nedenle olamaz Perl "güvenli sinyaller" sevk istediğinde yokladı ve gereken zamanlayıcılar kullanarak

alarmı Emulated. (Win32)

+0

Bunun için teşekkürler! – ansario

+1

Bunun böyle bir şey olabileceğini düşündüm. Kazı yapmak için aferin :) :) – Sobrique

+0

Ah 'perlport' !! –