/ / Как мога да се справя със системно обаждане, което се проваля? - прозорци, перл, справяне с грешки, външни

Как мога да се справя с "системно" обаждане, което не успее? - прозорци, perl, обработка на грешки, външни

Имам скрипт на Perl, който извиква външна програма. (В момента всъщност използвам заден план, но също толкова лесно можех да го използвам system или нещо от cpan.) Понякога програмата се проваля, което кара Windows да създаде диалогов прозорец "(външната програма) е спрял да работи" с текста

Windows проверява за решение на проблема ...

скоро заменен с

Проблем предизвика програмата да спре да работи правилно. Windows ще затвори програмата и ще ви уведоми, ако е налично решение.

За съжаление, това съобщение за грешка спира процеса от умиране, което кара Perl да не се връща, докато потребителят (аз!) Не кликне върху „Отказ“ или „Затвори програмата“. Има ли начин да избегнем това поведение?

В моя случай е допустимо програмата да се провали - тя върши полезна, но строго не е необходима работа. Но тъй като трябва да работи без надзор, не мога да го накарам да блокира останалата работа на програмата.

Отговори:

3 за отговор № 1

Проблемът при сегашния ви подход е, че задните белези & system блокирайте, докато външната програма работи / виси. Възможните други предложения могат да включват.

  • Използване на нишки и различни модули от Win32 семейството да заеме - изчакайте края на процеса или кликнете върху диалоговото поле. Това вероятно е излишно.
  • Използвайте алармен сигнал или събитие, за да събудите програмата си, когато външната програма отне „твърде дълго“, за да отговори.
  • Използвайте модул IPC, за да отворите програмата и да наблюдавате нейния напредък.
  • Ако не се нуждаете от връщащата се стойност на детската програма, STDOUT или STDERR, simbabque "s exec опция има заслуга, но ако трябва да държите дръжка на процеса, опитайте Win32::Process, Намерих това полезно по много поводи. Модулът "s wait методът може да бъде отлична алтернатива на моето предложение за аларма или предложението за сън на 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...