QObject::setParent: Cannot set parent, new Elternteil in einem anderen thread
Gruß
Ich habe folgende Klasse.
class MyClass : public QObject
{
Q_OBJECT
public:
Q_INVOKABLE QVariant status();
public:
MyClass(ClassX * classX);
public slots:
void slotA();
void slotB();
signals:
void signalA();
void signalB();
private:
void init();
void doSomething();
private:
ClassX * classX;
ClassA classA;
ClassB classB;
};
In MyClass
's constructor, ich classX
zu this.classX
und in init()
ich connect
einige classX
Signale zu MyClass
slots und Weise Umgekehrt und in someFunction()
ich benutze classA
und classB
.
In meinem controller
Klasse in Haupt-thread, erstelle ich MyClass
Objekt, und führen Sie es in anderen thread.
MyClass * myClass = new MyClass(classX);
connect(&myClassThread, SIGNAL(started()), myClass, SLOT(init()));
myClass->moveToThread(&myClassThread);
myClassThread.start();
Sehe ich folgende Warnung in qDebugger
.
QObject::setParent: Cannot set parent, new parent is in a different thread
Kann mir jemand sagen, warum bekomme ich die Warnung ?
Vielen Dank im fortgeschrittenen
PS 1: Die classX
erstellt im Haupt-thread.
PS 2 : denken Sie Daran, Alles, was gut funktioniert und ich habe kein problem, ich möchte nur wissen, der Grund für diese Warnung und wie man es beheben.
PS 3 : ich benutze auch den folgenden Befehl in der main-thread machen, dass das Objekt in javascript
.
webFrame->addToJavaScriptWindowObject("myClassObject", myClass);
Edit 1 : QThread myClassThread ist Klasse.
Edit 2 : ich glaube, der Mangel an Informationen, verwirrt Euch und ich bin sorry about that.
Den Konstruktor von MyClass
ist wie folgt :
MyClass::MyClass(ClassX * classX)
{
this.classX = classX;
}
- Möglich, Duplikat der QObject: kann Nicht erstellen, die Kinder für einen Elternteil, der in einem anderen thread
- einfach die x-te Frage zu diesem.
MyClass * myClass = new MyClass(classX);
sollteMyClass * myClass = new MyClass(0);
. Full stop. - Auch ohne Parameter bekomme ich noch die Warnungen
- Dies ist keine doppelte Frage, Wie man sehen kann, rief ich die Methoden von myClass über signal-slot! Auch wenn ich nicht aufrufen von Methoden oder gar nicht verwenden, das Objekt nach der Schöpfung, noch bekomme ich die Warnung
- Ich nicht erwähnen, signal-und slot. Wenn das code-snippet oben nicht funktioniert, mit new Myclass(0), dann ist es anders als in Ihrem wirklichen code (wie oben nur für die problem-und Verlustrechnung).
- mit MyClass(0) ich bekomme immer noch die Warnung, aber wie ich schon erwähnt habe, wird Der code ausgeführt, und ich habe kein problem, wollen einfach Nur, um die Warnung Grund
- zeigen Konstruktor von MyClass. geben Sie ein QObject ist, als Erster parameter des Konstruktors ohne es seiend verwendet als Eltern? In diesem Fall verwechselst du uns.
- Bitte prüfen Edit 2
Du musst angemeldet sein, um einen Kommentar abzugeben.
Let ' s klar sein. Ihr code nicht so funktioniert, wie Sie es beabsichtigten, um zu arbeiten. Das ist das, was der Rahmen sagt Sie.
Dies bedeutet, dass alle slots und Signale von einem bestimmten Objekt (vermutete
myClass
) wird nicht ausgeführt, im gleichen thread, als man erwartet. Die Frage, die hier Kreisen über die Eltern entwedermyClass
undclassX
ObjekteMöglichkeit I : myClass->moveToThread(&myClassThread); andernfalls
Ursache: myClass hat ein Elternteil bereits festgelegt. was verboten ist.
Bedeutet es, dass
init()
ausgelöst durch den thread von dem thread-ObjektmyClassThread
. Thread-Weise und event-wise, dies ist fast dasselbe, wie wenn SieMöglichkeit II : init() verstößt gegen die thread-Affinität
Ursache: `classX`oder ein geheimnisvoll verbundenen Objekt hat ein Elternteil bereits festgelegt ist oder nicht beweglich, um einen anderen thread. Denke widget.
moveToThread
erfolgreich sind, Sie habenMyClass
in einem thread, undclassX
in einem anderen thread. Sie zur Verfügung gestellt habenclassX
beim BaumyClass
.myClass
ist jetzt die Manipulation eines Objekts in einem anderen thread, und ohne weiteren code können wir nicht davon ausgehen, thread-Sicherheit oder korrekte Eltern-Kind-Affinität. BewertungMyClass
::MyClass` und MyClass::init gezielt.Was ist Passiert?
Break im debugger im controller-code und Blick auf die thread-id. Dann brechen Sie im debugger in der
init
Methode.Das ist falsch in mehrfacher Hinsicht:
myClassThread
Objekt wird zerstört, wenn dieser code-block endet.myClass
hat ein Elternteil zu sein. Objekt, das verschoben werden thread kann nicht jedes Elternteil. Nur ganze drei von Objekten, die verschoben werden können threads