Как обрабатывать неисправимые ошибки в потоке в Gtk-rs? - PullRequest
0 голосов
/ 12 февраля 2020

Я пишу приложение Gtk-rs. У меня есть фоновый поток, отправляющий события в основной поток Gtk через канал MPS C. Что мне делать с неустранимыми ошибками внутри фонового потока?

Я не хочу их обрабатывать ( В пани c! Или Не в пани c! ).

В настоящее время поток будет pani c, но основное приложение не остановится. Я бы хотел, чтобы все приложение обработало sh с ошибкой.

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)
});
  • Я не хочу отправлять Result через канал, потому что он не будет работать для паники в вызываемых functions.
  • Присоединение к потоку решит проблему, но я не думаю, что смогу сделать это с помощью Gtk-rs, поскольку он блокирует.

Этот вопрос похож на Как я могу заставить pani c в потоке немедленно завершить основной поток? , но мне интересно, есть ли лучшее решение для Gtk-rs.

1 Ответ

0 голосов
/ 12 февраля 2020

Изменение обработчика pani c с помощью 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);
    }));
}
...