2014-10-19 9 views
8

Dire che ho creato un QObject a e che ha un membro QObject b. (In realtà, sia A che B sono sottoclassi di QObject e la classe A ha un membro B b.)Qt moveToThread: quali risorse sono portate con l'oggetto?

Quando viene creato b, il suo genitore è 0 (impostazione predefinita). Nel codice, se non ho mai messo genitore b 's per a, e se chiamo movetothread() spostare a in un thread di lavoro, sarà b essere spostato in quel filo troppo?

Se non si sposta, se chiamo b.init() dal thread di lavoro (quello mi sono trasferita a in) che utilizzano operatore new per creare un altro QObject che ha b come un genitore, allora mi metterò il seguente errore, a destra ?

QObject: Impossibile creare i bambini per un genitore che si trova in un thread diverso

risposta

1

Come la documentazione Qt per QObject :: moveToThread afferma: -

Cambia l'affinità di thread per questo oggetto e dei suoi figli. L'oggetto non può essere spostato se ha un genitore. L'elaborazione degli eventi continuerà nel targetThread.

In questo caso, un genitore è un oggetto il cui bambino è impostata sia facendo passare il genitore nel costruttore o chiamando setParent sul bambino. Non è un oggetto che ha un puntatore a un altro oggetto.

Nel codice, se non ho mai messo genitore di b per una, e se chiamo movetothread() per spostare un in un thread di lavoro, sarà b essere spostato in quel filo troppo?

Quindi, no, se madre di B non è impostato e si chiama moveToThread sulla 'a', 'b' avrà ancora l'affinità thread originale.

Se non si sposta, se chiamo b.init() dal thread di lavoro ...

Se hai spostato 'a' e non 'b' ad un thread di lavoro, quindi non si dovrebbe chiamare b.init direttamente dal thread worker. Invece, l'oggetto nel thread di lavoro ('a') dovrebbe emettere un segnale per un oggetto nel thread originale per chiamare b.init da uno slot collegato

1

sarà b spostato in quel filo troppo?

No, QObject non sa che b è membro di a. (Lei non ha detto se a contiene un puntatore a b o se detiene b direttamente, ma la risposta è la stessa in entrambi i casi.)

poi mi metterò il seguente errore, giusto?

Il figlio di un QObject deve sempre essere creato nella discussione che possiede il padre. Sono riluttante a dire che riceverai sicuramente un errore, perché il comportamento potrebbe essere indefinito.

Vedere Threads and QObject.

Problemi correlati