2015-12-09 6 views
0

Я довольно новичок в QT, но использовал многопоточные методы на некоторых других платформах. Я делаю опрос в QThread, который я создаю в основном. Для этого я подклассифицировал его. Мне нужно передать некоторые параметры (QObjects) в поток, чтобы он мог выполнить некоторую работу. Но когда я пытаюсь использовать их, моя программа падает. Итак, мой вопрос в том, как я могу использовать те же QObjects в обоих потоках? Я буду использовать мьютексы для синхронизации, но я не могу избавиться от этой ошибки «Невозможно создать дочерние элементы для родителя, который находится в другом потоке».Как делиться QObjects между потоками в Qt

Существует четыре статических функции, которые работают с объектом QSerialPort.

QSerialPort serial; // this is in MyObject's class definition (instance variable) 

void MyQObject::func1(void *objData) 
{ 
    MyQObject *obj = static_cast<MyQObject*>(objData); 
    obj->serial.clear(QSerialPort::Input); 
} 

int MyQObject::func2(void *objData) 
{ 
    MyQObject *obj = static_cast<MyQObject*>(objData); 

    obj->serial.waitForReadyRead(0); 
    return obj->serial.bytesAvailable(); 
} 

void MyQObject::func3(ivoid *objData) 
{ 
    MyQObject *obj = static_cast<MyQObject*>(objData); 

    // Read data using serial.read() 
} 

void MyQObject::func4(void *objData) 
{ 
    MyQObject *obj = static_cast<MyQObject*>(objData); 

    // Read data using serial.write() 
} 

И в методе запуска MyThread я вызываю функции выше. Это вызывает сбой.

Ошибка:

QObject: Невозможно создать для детей одного из родителей, который находится в другом потоке. (Родитель QSerialPort, поток родителей является QThread, текущий поток OtherThread)

+0

Не может ли это быть проблемой взаимного исключения? – Claudio

+0

Вы должны использовать сигналы и слоты для связи между потоками. Также обратите внимание, что вы не можете создавать элементы GUI из другого потока. –

+0

Вам не разрешено передавать 'QObject' в другой поток, а затем создавать дочерние объекты этого объекта в другом потоке. Это причина вашего последнего сообщения. Что вы пытаетесь выполнить, передав 'QObject' вместо некоторых других данных? – RobbieE

ответ

0

Существует хороший шанс, что в obj->serial.waitForReadyRead(0); создается QObject (например, QTimer), который получает QSerialPort в качестве родителя. Это может вызвать проблему. Таким образом, решение может заключаться в том, чтобы найти способ создания объекта QSerialPort в вашем потоке.

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