2015-10-01 22 views
5

Durante il debug, voglio vedere cosa è in attesa del ciclo degli eventi del mio programma. Probabilmente è inondato, e voglio vedere con quali segnali, senza aggiungere (manualmente) uno specifico messaggio di log a ogni Q_EMIT.Come monitorare i segnali QT?

Possibili soluzioni potrebbero essere guardando qualche struttura-qt-dati interni che contiene l'gli eventi coda (c'è una cosa come??)

Or -

Scrivi un messaggio di log per ogni segnale emesso (È possibile?).

Altre idee?

(QT 4.8 su Windows, utilizzando Visual Studio 2012)

+0

Vuoi monitorare segnali o eventi? – vahancho

+0

Voglio monitorare i segnali. – Ronen

+1

Forse questo può aiutare: http://doc.qt.io/qt-5/qsignalspy.html? – vahancho

risposta

0

Non sono sicuro se questo è sufficiente per voi, ma si può provare ad installare event filters tra QObject che implementano eventFilter() in questo modo:

class MyWidget : public QWidget 
{ 
    QGraphicsView myView; 
    MyWidget() 
    { 
     myView->installEventFilter(this); 
     // incoming events to myView are shown on the standard output 
    } 
}; 

È possibile ottenere più creativo con questa lettura dei documenti.

+0

Grazie, ma non voglio essere oggetto specifico Voglio vedere tutti i miei segnali e ho molti oggetti per farlo manualmente. – Ronen

+1

È possibile ottenere tutti gli eventi se si installa il filtro eventi sull'oggetto QCoreApplication o QApplication, invece di un QGraphicsView come mostrato qui. – nos

+0

^che ________ – MatrixAndrew

0

La documentazione Qt per Events and Filters stati:

E 'anche possibile filtrare tutti gli eventi per l'intera applicazione, con l'installazione di un filtro eventi per l'oggetto o QApplicationQCoreApplication. Tali filtri di eventi globali vengono chiamati prima dei filtri specifici dell'oggetto. Questo è molto potente, ma rallenta anche la consegna degli eventi di ogni singolo evento nell'intera applicazione.

Pertanto, è possibile creare un filtro eventi su QApplication o QCoreApplication e monitorare tutti gli eventi, controllando il loro type.

In alternativa, QCoreApplication utilizza la funzione virtuale notify per consegnare eventi agli oggetti. L'override di QCoreApplication consente di visualizzare sia l'evento che QObject a cui verrà inizialmente consegnato l'evento *.

* Si noti che gli eventi vengono propagati agli oggetti padre, se l'oggetto di ricezione ignora l'evento.

Se si sceglie di utilizzare notify, essere consapevoli della direzione futura per questa funzione:

direzione futura: Questa funzione non sarà chiamata per gli oggetti che vivono al di fuori del thread principale in Qt 6. Applicazioni che ha bisogno che la funzionalità trovi nel frattempo altre soluzioni per le esigenze di ispezione degli eventi. La modifica può essere estesa al thread principale, causando la deprecazione di questa funzione.

1

I segnali e gli eventi sono due cose che non hanno nulla a che fare l'uno con l'altro.

Voglio vedere che cosa è in attesa del ciclo degli eventi del mio programma. Probabilmente è allagato.

Prima di tutto, andiamo nomenclatura rettilineo:

  • una coda evento è dove gli eventi sono memorizzati fino al parto;
  • un ciclo evento è ciò che drena coda degli eventi e fornisce eventi per QObjects,
  • un evento alluvionale accade quando, in media, durante la consegna di ogni evento v'è più di un evento aggiunto alla coda .

Ci sono due ragioni solo perché una coda di eventi potrebbe ottenere allagate:

  1. ci vuole troppo tempo per elaborare alcuni eventi (ad esempio, quando i blocchi di codice): il tasso di scarico della coda è inferiore al tasso di riempimento a causa dei tempi.
  2. Stai aggiungendo più di un evento per ogni evento consegnato (in media): il tasso di riempimento della coda è superiore al tasso di scarico a causa della moltiplicazione degli eventi - questo è completamente estraneo a qualsiasi tempistica. Un nome appropriato per questo sarebbe una tempesta di eventi .

Per rilevare il codice dei blocchi troppo a lungo, è possibile utilizzare a tool I wrote for another answer.

Per sapere quanti eventi sono in attesa di una determinata discussione, utilizzare il documento non documentato qGlobalPostedEventsCount(). Aggiungilo al codice dello strumento collegato a sopra.

Problemi correlati