2012-01-29 27 views
5

içinde belirli bir süreden sonra bir sistemi sonlandırma() Perl komut dosyasından komut satırı uygulaması çalıştırıyorum (sistem() kullanarak) bazen dönmüyor, kesin olması için istisna atar. uygulamayı iptal etmek için kullanıcı girişi. Bu betik, system() komutunu kullanarak çalıştırdığım uygulamanın otomatik test edilmesi için kullanılır. Otomatik testin bir parçası olduğu için istisna meydana gelirse sytem() komutu geri dönmeli ve testin başarısız olduğunu düşünmelidir.Windows

Bu uygulamayı çalıştıran bir kod parçası yazmak istiyorum ve istisna oluşursa, bu sınamanın başarısız olması için bu komut dosyasına devam etmesi gerekir.

Bunu yapmanın bir yolu, belirli bir süre boyunca uygulamayı çalıştırmaktır ve sistem çağrısı bu süre içinde geri dönmezse, sistemi() sonlandırmalı ve komut dosyasına devam etmeliyiz. Bunu başarmak için (How can I terminate a system command with alarm in Perl?)

kodu:

my @output; 
eval { 
    local $SIG{ALRM} = sub { die "Timeout\n" }; 
    alarm 60; 
    return = system("testapp.exe"); 
    alarm 0; 
}; 
if ([email protected]) { 
    print "Test Failed"; 
} else { 
    #compare the returned value with expected 
} 

ama bu biraz araştırma yaptım ve SIG (pencereler için kitap programlama Perl çalışmıyor öğrendim bu kod pencerelerde çalışmıyor). bazıları bunu bir pencerede nasıl gerçekleştirebilirim önerebilir?

cevap

6

Win32::Process modülüne bakmanızı öneririm. Bir süreci başlatmanıza, değişken bir süre boyunca beklemenize ve hatta gerekirse onu öldürmenize izin verir. dokümantasyon sağlayan örnek dayanarak, oldukça kolay görünür:

use Win32::Process; 
use Win32; 

sub ErrorReport{ 
    print Win32::FormatMessage(Win32::GetLastError()); 
} 

Win32::Process::Create($ProcessObj, 
         "C:\\path\\to\\testapp.exe", 
         "", 
         0, 
         NORMAL_PRIORITY_CLASS, 
         ".")|| die ErrorReport(); 

if($ProcessObj->Wait(60000)) # Timeout is in milliseconds 
{ 
    # Wait succeeded (process completed within the timeout value) 
} 
else 
{ 
    # Timeout expired. $! is set to WAIT_FAILED in this case 
} 

Ayrıca saniyelik uygun sayıda uyku ve bu modülde kill yöntemi kullanabilirsiniz. Kullanmak istediğiniz NORMAL_PRIORITY_CLASS oluşturma bayrağı olup olmadığından tam olarak emin değilim; Bu modülün belgeleri oldukça kötü. DETACHED_PROCESS bayrağını kullanarak bazı örnekler görüyorum. Neyin işe yaradığını görmek için o bölümle oynaman gerekecek.

+0

Çok teşekkürler olduğunu soyutlar! İşe yarıyor :) – int80h