2016-03-08 1 views
-1

ПриветствиеQObject :: setParent: невозможно установить родительский элемент, новый родитель находится в другой теме

У меня есть следующий класс.

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; 
}; 

В конструктор MyClass «с, я установил classX к this.classX и в init(), я connect некоторые из classX сигналов MyClass слотов и Wise-Versa, а в someFunction() я использовать classA и classB.

В моем controller классе в основной теме я создаю объект MyClass и запускаю его внутри другой темы.

MyClass * myClass = new MyClass(classX); 
connect(&myClassThread, SIGNAL(started()), myClass, SLOT(init())); 
myClass->moveToThread(&myClassThread); 
myClassThread.start(); 

Я вижу следующее предупреждение в qDebugger.

QObject::setParent: Cannot set parent, new parent is in a different thread 

Может ли кто-нибудь сказать мне, почему я получаю это предупреждение?

Благодаря передовой

PS 1: classX создан в основном потоке.

PS 2: Помните, что все работает нормально, и у меня нет проблем, я просто хочу знать причину этого предупреждения и как его исправить.

PS 3: Я также использую следующую команду в основной теме, чтобы открыть объект в javascript.

webFrame->addToJavaScriptWindowObject("myClassObject", myClass); 

Редактировать 1: QThread myClassThread является членом класса.

Редактировать 2: Я считаю, что недостаток информации, смутил вас, ребята, и я сожалею об этом.

Конструктор MyClass как это:

MyClass::MyClass(ClassX * classX) 
{ 
    this.classX = classX; 
} 
+2

Возможный дубликат [QObject: Невозможно создать детей для родителей, который находится в другом потоке] (HTTP: //stackoverflow.com/questions/3268073/qobject-cannot-create-children-for-a-parent-that-is-in-a-different-thread) – UmNyobe

+0

легко n-й вопрос об этом. 'MyClass * myClass = new MyClass (classX);' должен быть 'MyClass * myClass = new MyClass (0);'. Полная остановка. – UmNyobe

+0

@UmNyobe Даже без параметров я все еще получаю предупреждения –

ответ

0

Давайте будем ясны. Ваш код не работает так, как вы планировали его работу. Вот что говорит вам рамка.

QObject :: SetParent: Невозможно установить родителем, новый родитель находится в другом нити

Это означает, что все слоты и сигналы определенного объекта (подозреваемого myClass) не будет выполняться в том же самом как ожидалось. Проблема здесь вращаются вокруг родителя либо myClass и classX объектов

Возможность I: myClass-> moveToThread (& myClassThread); не удается

Причина: MyClass имеет родителя уже установлен. что запрещено.

Это означает, что init() будет запущен нитью объекта нити myClassThread. Thread-накрест и событийно-мудрый, это почти то же самое, как если бы вы сделали

MyClass * myClass = new MyClass(classX); 
QMetaObject::invokeMethod(myClass, "init", Qt::QueuedConnection); 

Возможность II: Init() нарушает сродством нити

Причина: `classX`` или таинственный связанный объект имеет родителя, уже установленного или не перемещаемого в другой поток. Подумайте, виджет.

moveToThread преуспеть, у вас есть MyClass в одной теме, и classX в другой теме. Вы предоставили classX при построении myClass. myClass теперь манипулирует объектом в другом потоке, и без дополнительного кода мы не можем предполагать безопасность потока или правильное родство родительского родителя. Просмотрите MyClass :: MyClass` и MyClass :: init тщательно.

Какой из них происходит?

Перерыв в отладчике в коде контроллера и просмотр идентификатора потока. Затем разбейте в отладчике метод init.

  • Если это та же нить, тогда я
  • В противном случае это случай II
+0

Спасибо большое за ответ youre, я получил его –

0

Это неправильно во многих отношениях:

QThread myClassThread; 
MyClass * myClass = new MyClass(classX); 
connect(&myClassThread, SIGNAL(started()), myClass, SLOT(init())); 
myClass->moveToThread(&myClassThread); 
myClassThread.start(); 
  1. Вы создаете объект потока в стеке не на куче! Это означает, что объект myClassThread будет уничтожен, когда этот блок кода закончится.
  2. myClass имеет родителя. Объект, перемещенный в поток, не может иметь родителя. Только целые три объекта могут быть перенесены в потоки
+0

Около 1: Я только что добавил Редактировать 1, myClassThread - это член класса на самом деле. Около 2: родителем myClass является QObject. Я не думаю, что это вызывает –

+0

. Вы перемещаете myClass в другой поток, но classX остается в основном потоке. Таким образом, предупреждение. Не используйте classX как родительский для myClass, если вы хотите переместить myClass в другой поток. –

Смежные вопросы