2016-07-01 2 views
1

A quoi faut-il faire attention lors de la réimplémentation de la fonction notify dans une application Qt multi-thread? Ceci est un exemple d'implémentation. Actuellement, il n'y a pas d'erreurs, mais je crains qu'une erreur puisse survenir car le multi-threading dans Qt utilise un slot de signal pour la communication qui utilise la fonction notify.QThread et implémentation de 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 est un module avec fonctionnalité de reporting

Répondre

2

En QT5, cela est sans danger. Cependant, from the documentation, dans Qt6 cela ne fonctionnera plus en dehors du thread principal, et en fait, la fonction est considérée pour la dépréciation dans Qt6 entièrement. Comme Kuba Ober l'a fait remarquer, réimplémenter notify pour intercepter les exceptions est une mauvaise idée, car les événements dans d'autres threads et tous les signaux mis en file d'attente sont délivrés de manière asynchrone.

+0

La réimplémentation de 'notify' a été effectuée pour implémenter un puits d'exception" fourre-tout ". 'postEvent' n'aura rien à voir avec ça, parce que le gestionnaire d'évènement ne s'exécute pas dedans. –

+0

@KubaOber: Doh. L'absence d'une signature de fonction et l'indentation du code m'ont troublé en ce qui concerne le but réel de l'auteur (par opposition à déclaré). Je vais réparer ma réponse. –

2

La capture de toutes les exceptions dans notify est un anti-pattern. C'était cool de faire ça, mais ça s'est avéré être une mauvaise idée. Alors ne fais pas ça. Si vos machines à sous ou vos gestionnaires d'événements se jettent, enveloppez leur code dans un bloc try-catch. notify vous donne une fausse impression de sécurité car dans de très nombreux cas, les signaux et les emplacements directement connectés sont appelés depuis les gestionnaires d'événements. Mais parfois ce ne sera pas le cas, et votre code va planter en raison d'une exception non gérée. Assurez-vous de connaître les codes Core C++ Error Handling Guidelines et C++ Exceptions and Error Handling FAQ.

+3

Je vais dans tout et renforcer cette idée: https://codereview.qt-project.org/#/c/162682/3/src/corelib/kernel/qeventloop.cpp – peppe