Как вернуться к основному потоку GUI при обработке прерывания?

У меня Raspberry Pi 3 работает с программой GUI, написанной на Qt. Я использую библиотеку wiringPi для установки прерывания, которое срабатывает, когда определенный вывод GPIO становится низким. Когда это происходит, я хочу, чтобы появилось диалоговое окно, сообщающее пользователю, что Pi отключится через 10 секунд, в течение которого у них есть возможность отменить выключение.

Проблема в том, что функция, которая получает прерывание, запускается в новом потоке, и Qt не позволяет использовать таймеры и т. Д. Вне основного потока. Я хотел бы знать, как я могу связаться с основным потоком из функции прерывания. Функция не принимает аргументов, кстати.

Пример кода:

MainWindow::MainWindow() {
    wiringPiSetup();
    //Set up an interrupt to detect when WiringPI pin 0 (header #11) goes low
    //Call the ShutdownISR function when this happens.
    wiringPiISR(0, INT_EDGE_FALLING, &ShutdownISR);
}

//Non-member, free function. Handles interrupt.
void ShutdownISR() {
    //Crashes the program with errors about doing GUI stuff outside the main thread
    ShutdownDialog* sdDlg = new ShutdownDialog();
    sdDlg->exec();
} 

1 ответ

Решение

Прерывания AFAIU обрабатываются только ядром Linux и не видны непосредственно для кода приложения. Однако следует помнить о сигналах Unix и сигналах чтения (7) и безопасности сигналов (7), а также передовых системах программирования и операционной системы Linux : три простых компонента

Что касается Qt и сигналов, это задокументировано; смотрите вызов функций Qt из обработчиков сигналов Unix

Другие вопросы по тегам