2016-04-09 18 views
1

Bir video oyunundan kareleri kaydeden bir C++ programına birkaç çağrı yürütmem gerekiyor. 1800 civarında test oyunum var, bazıları da çalışıyor ve bazıları değil.Belirli bir süre sonra komutu durdurun ve sonucunu Bash olarak geri döndürün

Çalışmıyorlarsa, konsol bir Segmentasyon hatası hatası döndürür, ancak iş yaparken program bir pencereyi açar ve oyunu oynatır ve aynı zamanda her kareyi kaydeder.

Sorun, işe yaradığında, oyun penceresini kapatana kadar bu işlem bitmez.

Sahip olduğum her oyunu test edecek ve bir metin dosyasında çalışanların isimlerini ve başka bir dosyada çalışmayanların adlarını yazacak bir Bash komut dosyası hazırlamalıyım. Ben timeout komutunu kullanarak, bununla çalıştık an için

:

count=0 
# Run for every file in the ROMS folder 
for filename in ../ROMs/*.bin; do 
    # Increase the counter 
    ((count++)) 
    # Run the command with a timeout to prevent it from being infinite 
    timeout 5 ./doc/examples/videoRecordingExample "$filename" 
    # Check if execution succeeds/fails and print in a text file 
    if [ $? == 0 ]; then 
     echo "Game $count named $filename" >> successGames.txt 
    else 
     echo "Game $count named $filename" >> failedGames.txt 
    fi 
done 

aynı dosya üzerinde bütün isimleri yazıyor çünkü Ama, çalışıyor gibi görünmüyor. Bunun nedeni, if'daki koşulun, C++ programının kendisinin değil, zaman aşımına işaret etmesidir.

Daha sonra timeout olmadan denedim ve bir oyun her çalıştığında, pencereyi elle kapattım ve sonuç beklenen oldu. Bunu sadece 10 oyunla denedim, ancak 1800'le test ettiğimde tamamen otomatik olması gerekiyordu.

Bu işlemi otomatik hale getirmenin herhangi bir yolu var mı? Yürütmeyi durdurmak ve aynı zamanda başarılı olup olmadığını bilmek için bazı komutlar gibi?

+0

Belki 'timeout --signal 9 - koruma durumu ... vs.' Daha iyi çalışır mı? – agc

cevap

0

yerine

timeout 5 ./doc/examples/videoRecordingExample "$filename" 

size bu deneyebilirsiniz: zaman aşımı kodunda

./doc/examples/videoRecordingExample "$filename" && sleep 5 && pkill videoRecordingExample 
+0

Bunu şimdi denedim ve biraz garip çünkü şimdi oyun penceresini elle kapatmam gerekiyor, ama sonra bir sonraki oyunu denemek 5 saniye bekler. –

0

Takas argümanlar. Olmalıdır:

timeout 5 "$filename" ./doc/examples/videoRecordingExample 

Sebep: zaman aşımı sözdizimi şöyledir:

zaman aşımı [seçenek] SÜRE KOMUTANLIĞI [ARG] ...

Yani KOMUTANLIĞI olmalıdır DURATION'dan hemen sonra. Yukarıdaki kodda, muhtemelen her seferinde bir hata döndüren COMMAND, muhtemelen çalıştırılamaz dosya videoRecordingExample olacaktır.

+0

VideoRecordingExample dosyası gayet iyi çalışıyor, benim için işe yaradı, bunun gerçekten sorun olduğunu düşünmüyorum ... Sorun şu ki, bir sonraki oyuna gitmek istersem pencereyi elle kapatmak zorundayım. tüm otomatik olması için ister. Ayrıca, "$ filename", C++ programına giriş parametresidir. –

+0

@MartaSampietro, diyorsunuz ki * videoRecordingExample * bir yürütülebilir dosya C++ programı mı? Bir 'doc' alt klasöründe, bu belli değil. – agc

+0

Evet, çalışıyor ve doc/example alt klasörlerinin içinde evet. Üzgünüm yazıyı iyi açıklamamış olsam da, evet, program gayet iyi çalışıyor, sahip olduğum tek sorun, ne olduğunu bilmek için icraatını nasıl otomatik olarak iptal edeceğimi ve durumunu bilmem gerektiğini bilmem. oyunlar C++ programı için çalışıyor ve hangi oyunları oynamıyorsunuz. –

İlgili konular