Qt moveToThread: Welche Ressourcen werden mit dem Objekt mitgebracht?

9

Angenommen, ich habe ein QObject a erstellt und es hat ein Mitglied QObject b . (Tatsächlich sind sowohl A als auch B Unterklassen von QObject und Klasse A hat ein Mitglied B b .)

Wenn b erstellt wird, ist das übergeordnete Element 0 (Standard). Wenn ich im Code nie b 's Eltern auf a setze, und wenn ich movetothread() anrufe, um a in einen Worker-Thread zu verschieben, wird b auch in diesen Thread verschoben ?

Wenn es nicht verschoben wird, wenn ich b.init() vom Worker-Thread (den ich a verschoben habe) aufrufen, der einen neuen Operator benutzt, um ein anderes QObject zu erzeugen, das b als Eltern hat, dann bekomme ich der folgende Fehler, richtig?

  

QObject: Es können keine untergeordneten Elemente für ein übergeordnetes Element in einem anderen Thread erstellt werden

    
Nyaruko 19.10.2014, 16:44
quelle

2 Antworten

2

Wie die Qt-Dokumentation für QObject :: moveToThread besagt: -

  

Ändert die Thread-Affinität für dieses Objekt und seine untergeordneten Elemente. Das Objekt kann nicht verschoben werden, wenn es übergeordnete Objekte hat. Die Ereignisverarbeitung wird im targetThread fortgesetzt.

In diesem Fall ist ein Parent ein Objekt, dessen Kind entweder durch Übergeben des Elternelements im Konstruktor oder durch Aufrufen von setParent für das Kind festgelegt wird. Es ist kein Objekt, das einen Zeiger auf ein anderes Objekt hat.

  

Wenn ich b im booleschen Elternteil niemals auf a setze, und wenn ich movetothread () aufruft, um a in einen Worker-Thread zu verschieben, wird b ebenfalls in diesen Thread verschoben?

Also, nein, wenn das Elternelement von b nicht gesetzt ist und Sie moveToThread auf 'a' aufrufen, hat 'b' immer noch die ursprüngliche Thread-Affinität.

  

Wenn es nicht verschoben wird, wenn ich b.init () vom Worker-Thread ...

aufruft

Wenn Sie "a" und nicht "b" in einen Arbeitsthread verschoben haben, sollten Sie b.init nicht direkt vom Arbeitsthread aufrufen. Stattdessen sollte das Objekt im Worker-Thread ('a') ein Signal für ein Objekt im ursprünglichen Thread ausgeben, um b.init von einem verbundenen Slot aus aufzurufen

    
TheDarkKnight 20.10.2014, 13:01
quelle
1
  

wird b auch in diesen Thread verschoben?

Nein, QObject weiß nicht, dass b ein Mitglied von a ist. (Sie haben nicht gesagt, ob a einen Zeiger auf b enthält oder ob% code_% direkt enthält, aber die Antwort ist in beiden Fällen gleich.)

  

Dann bekomme ich den folgenden Fehler, richtig?

Das Kind eines b muss immer in dem Thread erstellt werden, der das Elternteil besitzt. Ich zögere zu sagen, dass Sie definitiv einen Fehler bekommen werden, weil das Verhalten undefiniert sein kann.

Siehe Threads und QObject .

    
Oktalist 19.10.2014 17:47
quelle

Tags und Links