2014-10-19 7 views
8

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 Element B b.)Qt moveToThread: Welche Ressourcen werden mit dem Objekt mitgebracht?

Wenn b erstellt wird, ist das übergeordnete Element 0 (Standard). Wenn ich in dem Code 's Eltern nie zu a setze, und wenn ich movetothread() aufrufen, um a in einem Worker-Thread zu verschieben, wird b in diesem Thread zu verschoben?

Wenn es nicht bewegt wird, wenn ich b.init() vom Arbeiter-Thread aufrufen (die, die ich a in verschoben), die neuen Betreiber verwenden eine andere QObject zu erstellen, die b als Eltern hat, dann werde ich die folgende Fehlermeldung erhalten, rechts ?

QObject: Kann nicht Kinder für Eltern schaffen, die in einem anderen Thread ist

Antwort

1

Als Dokumentation Qt für QObject :: moveToThread heißt es: -

Ändert die Threadaffinität für dieses Objekt und seine Kinder. Das Objekt kann nicht verschoben werden, wenn es ein Elternobjekt hat. Die Ereignisverarbeitung wird im targetThread fortgesetzt.

In diesem Fall ist ein Elternteil ein Objekt, dessen Kind entweder, indem man die Eltern im Konstruktor oder durch den Aufruf setParent auf das Kind eingestellt ist. Es ist kein Objekt, das einen Zeiger auf ein anderes Objekt hat.

in dem Code, wenn ich nie b der Eltern auf a, und wenn ich movetothread() aufrufen, eine in einem Arbeitsthread zu bewegen, auch in diesem Thread verschoben wird b?

Also, nein, Eltern, wenn bs nicht gesetzt ist und Sie rufen moveToThread auf ‚a‘, ‚b‘ wird immer noch die Original-Thread-Affinität.

Wenn es nicht bewegt wird, wenn ich b.init() aus der Arbeiter-Thread nennen ...

Wenn Sie noch 'a' bewegt und nicht 'b' zu einem Worker-Thread, dann sollten Sie b.init nicht direkt vom Worker-Thread aufrufen. Stattdessen sollte das Objekt im Arbeitsthread ('a') ein Signal für ein Objekt im ursprünglichen Thread ausgeben, um b.init von einem verbundenen Steckplatz aus anzurufen

1

wird b auch in diesem Thread verschoben werden?

Nein, QObject weiß nicht, dass b Mitglied a ist. (Sie hat nicht gesagt, ob a einen Zeiger auf b hält oder ob es b hält direkt, aber die Antwort ist in beiden Fällen gleich.)

dann werde ich die folgende Fehlermeldung erhalten, nicht wahr?

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

Siehe Threads and QObject.

Verwandte Themen