我正在编写一个 Gtk-rs 应用程序。我有一个后台线程通过 MPSC 通道将事件发送到主 Gtk 线程。 我应该如何处理此后台线程中不可恢复的错误?
我不想处理它们(惊慌!或不惊慌!(。
目前,线程会死机,但主应用程序不会停止。我希望整个应用程序因错误而崩溃。
let (sender, receiver) = glib::MainContext::channel(glib::PRIORITY_DEFAULT);
// Spawn the thread and move the sender in there
thread::spawn(move || {
loop {
let msg = do_work().unwrap();
sender.send(msg).unwrap();
}
});
receiver.attach(None, move |msg| {
...
glib::Continue(true)
});
- 我不想通过通道发送结果,因为它不适用于调用函数中的恐慌。
- 加入线程可以解决问题,但我认为我不能用 Gtk-rs 做到这一点,因为它正在阻塞。
这个问题类似于我如何在线程上引起恐慌以立即结束主线程?,但我想知道 Gtk-rs 有更好的解决方案。
用set_hook
更改紧急处理程序可以解决问题。
fn change_panic_behaviour() {
let hook = std::panic::take_hook();
std::panic::set_hook(Box::new(move |error| {
hook(error);
std::process::exit(1);
}));
}