1

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

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レポート機能を備えたモジュールです

4

2 に答える 2

2

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

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

于 2016-07-01T15:49:48.367 に答える
2

Qt5 では、これは安全です。ただし、ドキュメントによると、Qt6 では、これはメイン スレッドの外部では機能しなくなります。実際、この関数は Qt6 で完全に非推奨と見なされています。

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

于 2016-07-01T11:30:14.397 に答える