2017-06-27 9 views
3

Qtで書かれたGUIプログラムを実行しているRaspberry Pi 3があります。私はwiringPi libraryを使用して、特定のGPIOピンがLowになったときに発生する割り込みを設定しています。これが起こると、Piが10秒後にシャットダウンするというダイアログウィンドウが表示され、シャットダウンをキャンセルするオプションが表示されます。割り込み処理中にメインのGUIスレッドに戻るには?

割り込みを受け取る関数が新しいスレッドで起動され、Qtでタイマーなどがメインスレッドの外部で使用されないという問題があります。私はどのように私は割り込み関数からメインスレッドに通信することができます知っていると思います。この関数は引数btwを受け付けません。

例コード:

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(); 
} 

答えて

3

AFAIU interruptsのみLinux kernelによって処理され、アプリケーション・コードに直接見えません。しかしながら、unix signalsを認識するとQtと信号についてsignal(7) & & signal-safety(7)Advanced Linux Programming & Operating Systems : Three Easy Pieces

を読み、それが文書化されています。 Calling Qt Functions From Unix Signal Handlers

+0

Qtドキュメントの例は完全に機能しました。ありがとうございました。 – Carlton

関連する問題