处理中断时如何返回主GUI线程?

时间:2017-06-27 19:38:20

标签: c++ multithreading qt raspberry-pi wiringpi

我有一个运行用Qt编写的GUI程序的Raspberry Pi 3。我正在使用wiringPi library来设置当某个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 个答案:

答案 0 :(得分:3)

AFAIU interrupts仅由Linux kernel处理,并且不会直接显示应用程序代码。但是,请注意unix signals并阅读signal(7)& signal-safety(7)& Advanced Linux Programming& Operating Systems : Three Easy Pieces

关于Qt和信号,记录在案;见Calling Qt Functions From Unix Signal Handlers