0

我正在编写一个 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 有更好的解决方案。

4

1 回答 1

0

更改恐慌处理程序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);
    }));
}
于 2020-02-12T17:45:36.457 回答