Die Geschichte:
Ich benutze die QtConcurrent API für jede "lange" Operation in meiner Anwendung. Es funktioniert ziemlich gut, aber ich habe einige Probleme mit der Erstellung von QObjects.Gibt es eine Möglichkeit festzustellen, ob ein QObject zu einem "toten" QThread gehört?
Betrachten Sie dieses Stück Code, der einen Thread verwenden, um ein „Foo“ Objekt zu erstellen:
QFuture<Foo*> = QtConcurrent::run([=]()
{
Data* data = /*long operation to acquire the data*/
Foo* result = new Foo(data);
return result;
});
Es funktioniert gut, aber wenn die „Foo“ Klasse von QObject Klasse abgeleitet ist, das „Ergebnis“ Instanz gehört zu dem QThread, der das Objekt erstellt hat.
So richtig zu verwenden Signal/Slot mit der „Ergebnis“ So sollte man so etwas tun:
QFuture<Foo*> = QtConcurrent::run([=]()
{
Data* data = /*long operation to acquire the data*/
Foo* result = new Foo(data);
// Move "result" to the main application thread
result->moveToThread(qApp->thread());
return result;
});
nun alle Arbeiten wie exepected, und ich denke, das ist das normale Verhalten ist und die nominale Lösung.
Das Problem:
Ich habe eine Menge von dieser Art von Code, die manchmal Objekte erstellen, die auch Objekte erstellen können. Die meisten von ihnen werden ordnungsgemäß mit einem "moveToThread" -Aufruf erstellt.
Aber manchmal vermisse ich einen "moveToThread" Anruf.
Und dann, viele Dinge sehen aus wie sie nicht funktionieren (weil diese Objektsteckplätze "gebrochen" sind), ohne jede Qt-Warnung.
Jetzt verbringe ich manchmal viel Zeit, um herauszufinden, warum etwas nicht funktioniert, bevor ich verstehe, nur weil die Slots nicht mehr für eine bestimmte Objektinstanz aufgerufen werden.
Die Frage:
Gibt es eine Möglichkeit, mir zu helfen diese Art von Situation zu verhindern/detect/debug? Zum Beispiel:
- eine Warnung jedes Mal ein QThread protokolliert, die gelöscht wird, aber es gibt Objekte lebendig, die zu ihr gehört?
- Wird jedes Mal eine Warnung protokolliert, wenn ein Signal an ein Objekt gesendet wird, das QThread gelöscht wurde?
- eine Warnung jedes Mal protokolliert wird, wenn ein Signal an ein Objekt (in einem anderen Thread) gesendet und nicht vor einem Timeout verarbeitet wird?
Dank
Gibt es einen Grund, dass die 'foo' Typ 'QObject 's müssen Nicht-Haupt-Thread-Affinität haben (was ich denke, du meinst mit" gehört zu ")? – eclarkso
Die dritte Frage ist ein Duplikat; Bitte entferne es. Sie fragen, wie man eine Hung-Event-Schleife erkennt - unabhängig davon, ob ein Signal ausgegeben wird. Siehe [hier] (http://stackoverflow.com/q/25038829/1329652). –