2014-10-19 11 views
8

Powiedz, że utworzyłem obiekt QObject a i ma on element QObject b. (W rzeczywistości zarówno A, jak i B są podklasami QObject, a klasa A ma element B b.)Qt moveToThread: Jakie zasoby są dostarczane z obiektem?

Po utworzeniu b, jego rodzicem jest 0 (domyślnie). W kodzie, jeśli nigdy nie ustawię nadrzędnego b dla a i jeśli zadzwonię pod movetothread(), aby przenieść a do wątku roboczego, będzie b zostać przeniesiony do tego wątku również?

Jeśli nie zostanie przeniesione, jeśli zadzwonię b.init() z wątku roboczego (jeden przeniosłem a do), które wykorzystują nowego operatora, aby utworzyć kolejną QObject który ma b jako rodzic, potem dostanie się następujący błąd, prawo ?

QObject: Nie można utworzyć dzieci dla rodzica, który jest w innym wątku

Odpowiedz

1

W dokumentacji Qt dla QObject :: moveToThread stwierdza: -

Zmienia powinowactwo wątek dla tego obiektu i jego dzieci. Obiekt nie może zostać przeniesiony, jeśli ma element nadrzędny. Przetwarzanie zdarzeń będzie kontynuowane w targetThread.

W tym przypadku rodzic jest obiektem, którego dziecko jest ustawione przez przekazanie rodzica w konstruktorze lub przez wywołanie metody setParent na elemencie podrzędnym. Nie jest obiektem, który ma wskaźnik do innego obiektu.

W kodzie, jeśli nie mogę ustawić rodzica B do A, a jeśli zadzwonię movetothread(), aby przenieść się do wątku roboczego, będzie b zostać przeniesione do tego wątku zbyt?

Tak, nie, jeśli rodzic B nie jest ustawiony i zadzwonić moveToThread na „a”, „b” będzie jeszcze oryginalny wątek powinowactwo.

Jeśli nie zostanie przeniesione, jeśli zadzwonię b.init() z wątku roboczego ...

Jeśli przeniósł 'a', a nie 'b' Do wątku roboczego, wtedy nie powinieneś wywoływać b.init bezpośrednio z wątku roboczego. Zamiast tego obiekt w wątku roboczym ("a") powinien emitować sygnał dla obiektu w oryginalnym wątku, aby wywołać b.init z podłączonego gniazda

1

będzie b być przeniesione do tego wątku zbyt?

Nie, QObject nie wie, że b jest członkiem a. (Nie powiem czy a posiada wskaźnik do b lub czy posiada ona b bezpośrednio, ale odpowiedź jest taka sama w obu przypadkach.)

wtedy pojawia się następujący błąd, prawda?

Dziecko z QObject musi zawsze zostać utworzone w wątku będącym właścicielem rodzica. Nie chcę powiedzieć, że na pewno wystąpi błąd, ponieważ zachowanie może być nieokreślone.

Zobacz Threads and QObject.

Powiązane problemy