Имам скрипт на Perl, който извиква външна програма. (В момента всъщност използвам заден план, но също толкова лесно можех да го използвам system
или нещо от cpan.) Понякога програмата се проваля, което кара Windows да създаде диалогов прозорец "(външната програма) е спрял да работи" с текста
Windows проверява за решение на проблема ...
скоро заменен с
Проблем предизвика програмата да спре да работи правилно. Windows ще затвори програмата и ще ви уведоми, ако е налично решение.
За съжаление, това съобщение за грешка спира процеса от умиране, което кара Perl да не се връща, докато потребителят (аз!) Не кликне върху „Отказ“ или „Затвори програмата“. Има ли начин да избегнем това поведение?
В моя случай е допустимо програмата да се провали - тя върши полезна, но строго не е необходима работа. Но тъй като трябва да работи без надзор, не мога да го накарам да блокира останалата работа на програмата.
Отговори:
3 за отговор № 1Проблемът при сегашния ви подход е, че задните белези & system
блокирайте, докато външната програма работи / виси. Възможните други предложения могат да включват.
- Използване на нишки и различни модули от
Win32
семейството да заеме - изчакайте края на процеса или кликнете върху диалоговото поле. Това вероятно е излишно. - Използвайте алармен сигнал или събитие, за да събудите програмата си, когато външната програма отне „твърде дълго“, за да отговори.
- Използвайте модул IPC, за да отворите програмата и да наблюдавате нейния напредък.
- Ако не се нуждаете от връщащата се стойност на детската програма, STDOUT или STDERR, simbabque "s
exec
опция има заслуга, но ако трябва да държите дръжка на процеса, опитайтеWin32::Process
, Намерих това полезно по много поводи. Модулът "swait
методът може да бъде отлична алтернатива на моето предложение за аларма или предложението за сън на simabque с допълнително предимство, че вашата програма няма да спи по-дълго, отколкото се изисква от детето.
0 за отговор № 2
Ако не е необходимо да изчаквате външната програма да завърши да продължи, можете да направите exec
вместо system
и никога няма да се върне.
Винаги можете да добавите sleep $n
след това, за да изчака теоретично да завърши външната програма.
exec("maybe_dies.exe");
sleep 1; # make sure it does stuff before it dies, or not, or whatever...