2016-07-01 11 views
1

マルチスレッドQtアプリケーションでnotify関数を再実装する際に注意すべき点はありますか? これは実装例です。 現在、エラーはありませんが、Qtのマルチスレッドで通知機能を使用する通信用のシグナルスロットを使用しているため、エラーが発生する可能性があります。Q通知と通知の実装

TApplication::notify(QObject *receiver, QEvent *event) 
{ 
    bool returnValue(false); 
    try 
    { 
     returnValue = QApplication::notify(receiver, event); 
    } 
    catch (IExceptionBase& e) 
    { 
     if (!fMain.isNull()) 
     { 
      //report error to output and file log 
     } 
     else 
     { 
      //report error to output 
     } 
    } 
    catch (...) 
    { 
     if (!fMain.isNull()) 
     { 
      //report error to output and file log 
     } 
     else 
     { 
      //report error to output 
     } 
    } 
    return returnValue; 
} 

fMainこれは安全である、Qt5で機能

答えて

2

を報告してモジュールです。しかし、from the documentation、Qt6では、これはもはやメインスレッド外では機能しません。実際、この関数はQt6での非推奨とみなされています。

Kuba Ober氏によると、例外をキャッチするためにnotifyを再実装することは、他のスレッドのイベントとキューに入れられた信号が非同期に配信されるため、悪い考えです。

+0

ブランケット「catch-all」例外シンクを実装するために、「notify」の再実装が行われました。 'postEvent'はイベントハンドラがその中から実行されないため、何もしません。 –

+0

@KubaOber:Doh。ファンクションシグネチャとコードインデントの欠如は、著者の実際の(対して述べられた)目的に関して私を混乱させました。私は私の答えを修正します。 –

2

notifyですべての例外をキャッチすることは、パターンがありません。以前は涼しかったですが、悪い考えです。そうしないでください。スロットまたはイベントハンドラがスローされた場合は、コードをtry-catchブロックにラップします。 notifyは、非常に多くの場合、シグナルと直接接続されたスロットがイベントハンドラから呼び出されるため、誤った安全感を与えます。しかし時にはそうでない場合もあり、処理されない例外のためにコードがクラッシュすることがあります。

Core C++ Error Handling GuidelinesC++ Exceptions and Error Handling FAQに精通していることをご確認ください。

+3

私はこのアイデアを補強するつもりです:https://codereview.qt-project.org/#/c/162682/3/src/corelib/kernel/qeventloop.cpp – peppe

関連する問題