Похоже, что основная проблема заключается в том, что устройство USB не работает. Все может случиться с процессом Windows в любое время; устройство должно иметь возможность справиться с этим. Если процесс, с которым он взаимодействует, исчезает, устройство должно уметь распознавать это и иметь дело с ним. Я не знаю специфики (не являюсь самим автором драйвера), но есть много USB-устройств, которые не просто перестают работать только потому, что программа, которая его использовала, была принудительно прекращена.
Это говорит о том, что это приводит ко второму вопросу: из вашего описания кажется, что «другой процесс» решительно завершает вашу программу. Зачем? Есть более изящные способы выхода из программы. По крайней мере, просто отправить WM_CLOSE
в главное окно, как если бы пользователь был нажать кнопку «Закрыть» кнопку , нажав Alt + F4 и т.д. Еще лучше, обеспечивают некоторый тип связи между процессами (например, named pipe), чтобы родительский процесс мог предоставить определенные команды, в том числе один для закрытия, вашей программе.
Если ваш процесс принудительно завершен, вы ничего не можете с этим поделать, но не изнутри этого процесса. Вы не можете запускать какой-либо код завершения и не можете создавать специальные потоки, которые продолжаются даже после того, как процесс будет убит.
Одним из вариантов было бы написать еще одну программу - «сторожевой таймер», которая контролирует состояние вашей программы. Если ваша программа завершена, тогда сторожевой таймер может очистить USB-устройство. Но это не панацея; кто-то может также убить сторожевой процесс и оставить вас там, где вы начали.
Но если вы можете устроить так, что даже наименьшее количество сотрудничества между другим процессом и вашим, то вы можете воспользоваться обычными механизмами, такими как Application.Exit
события или окна Closing
или Closed
события.
Хмм ... напоминает мне о [«ИСТИНА ВСЕГДА исполняет» легенду] (http://thedailywtf.com/articles/My-Tales). Не совсем справедливо сравнивать с вашим вопросом, так как у вас есть некоторые разумные ожидания. – JDB
@JDB это была хорошая сказка! Ну, вытаскивание вилки немного экстремально, но «Прекратить работу с диспетчером задач» или даже с ошибкой переполнения стека - это некоторые вещи, которые я хотел бы рассмотреть. Даже если ответ «нет, чувак», потому что как таковой я бы разобрал ситуацию и искал другой способ решить проблему. – heltonbiker