QObject: Невозможно создать дочерние элементы для родителя, который находится в другом потоке: поток родителя: QThread (0x221f650), текущий поток: QThread (0x23a7950) - PullRequest
0 голосов
/ 10 октября 2018

Я пытаюсь получить данные с устройства, используя QTCpSocket (telnet).После большой борьбы я почувствовал, что преодолел одну проблему, которая была Qtimer: starttimer не может быть запущен из другого потока.

Но теперь я столкнулся с другой проблемой, которая меня сильно смущает. Я прошел через какую-то публикацию в интернете, но она мне не помогает.Пожалуйста, пройдите мой код и сообщите мне мою ошибку

fdu.cpp

#include "fdu.h"
#include "ui_fdu.h"
#include"fduprocess.h"
fdu::fdu(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::fdu)
{
    ui->setupUi(this);
    QThread *workerThread =  new QThread;
    fduprocess *worker = new fduprocess;

 qDebug()<< "...goind to fduprocess........";
    workerThread->start();
    worker->_ReconnectionTimerInstance.setSingleShot(true);
    worker->_ReconnectionTimerInstance.start(1000);
    worker->_iStatusPollTimer = startTimer(500);
    worker->moveToThread(workerThread);
    connect(workerThread,SIGNAL(started()),worker,SLOT(tryit()));
    connect(workerThread,SIGNAL(finished()),worker,SLOT(deleteLater()));

}

fdu::~fdu()
{
    delete ui;
}

fduprocess.cpp

#include "fduprocess.h"
#include<QDebug>
#include<QThread>
fduprocess::fduprocess(QObject *parent) : QObject(parent)
{

}

void fduprocess::timerEvent(QTimerEvent *event)
{
    if(event->timerId()== _iStatusPollTimer)
    {

        if(_ClientSocketInstance.state() == QAbstractSocket::ConnectedState)
        {
            _ClientSocketInstance.write("alarmstat\r\n"); //25
             _ClientSocketInstance.write("selectedin\r\n"); // 4
              _ClientSocketInstance.write("sigoutstat\r\n"); //13
           _ClientSocketInstance.write("disablestat\r\n"); //5

           _ClientSocketInstance.write("pwrstat\r\n"); //5

           _ClientSocketInstance.write("siginstat\r\n");//5
        }
    }
}

void fduprocess::tryit()
{
 qDebug()<< "...came inside tryit to tryit.........";
 connect(&_ReconnectionTimerInstance,SIGNAL(timeout()), this, SLOT(when_ReconnectionTimer_timeout()));
  qDebug()<< "...conencted to whentimeout.........";
 connect(&_ClientSocketInstance,SIGNAL(connected()), this, SLOT(when_ClientSocketInstance_connected()));
 connect(&_ClientSocketInstance,SIGNAL(disconnected()), this, SLOT(when_ClientSocketInstance_disconnected()));
 connect(&_ClientSocketInstance,SIGNAL(readyRead()), this, SLOT(when_ClientSocketInstance_readyRead()));
 connect(&_ClientSocketInstance,SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(when_ClientSocketInstance_error(QAbstractSocket::SocketError)));
 _strIPAddress = "192.168.1.135";
 _usiPort = 23;
  qDebug()<< "...end tryit........";


}

void fduprocess::doOntimeout()
{
    qDebug()<< "................";
}

void fduprocess::when_ReconnectionTimer_timeout()
{
    qDebug()<<"Reconnecting..";
      // qDebug()<< _ClientSocketInstance.children();
        _ClientSocketInstance.connectToHost(_strIPAddress, _usiPort);
}

void fduprocess::when_ClientSocketInstance_connected()
{ qDebug()<<"Connected......";

    _ClientSocketInstance.write("endrun_1");
    _ClientSocketInstance.flush();
    _ClientSocketInstance.write("\n");
    _ClientSocketInstance.write("\n");
    _ClientSocketInstance.write("\n");
    _ClientSocketInstance.flush();

}

void fduprocess::when_ClientSocketInstance_disconnected()
{
    qDebug()<<"Disconnected";
        _ReconnectionTimerInstance.start();
}

void fduprocess::when_ClientSocketInstance_readyRead()
{
    QByteArray get = _ClientSocketInstance.readLine();
    qDebug() << get ;
}

void fduprocess::when_ClientSocketInstance_error(QAbstractSocket::SocketError error)
{

}

Любые другие отзывы, касающиеся любых других запахов кода, будут приветствоваться. Пожалуйста, игнорируйте мои соглашения об отступах и именах, так как я нахожусь в своей кривой обучения. Вот вывод консоли:

...goind to fduprocess........
...came inside tryit to tryit.........
...conencted to whentimeout.........
...end tryit........
Reconnecting..
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QTcpSocket(0x609250), parent's thread is QThread(0x221f650), current thread is QThread(0x23a7950)
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QTcpSocket(0x609250), parent's thread is QThread(0x221f650), current thread is QThread(0x23a7950)
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QTcpSocket(0x609250), parent's thread is QThread(0x221f650), current thread is QThread(0x23a7950)

1 Ответ

0 голосов
/ 10 октября 2018

Когда вы создаете worker, объект и все его члены создаются в главном потоке.Затем вы перемещаете worker в свой собственный поток, который перемещает все его дочерние объекты QObject.Все слоты в worker теперь будут выполняться в этом новом потоке.

Из конструктора fduprocess похоже, что вы не присваиваете родительский элемент своему сокету (_ClientSocketInstance).Это означает, что сокет не перемещается в тот же поток, что и рабочий, но остается в основном потоке, что выдает это предупреждение, когда вы используете его из слота.Если вы передадите this конструктору _ClientSocketInstance, чтобы сделать его дочерним элементом worker, он автоматически будет перемещен в тот же поток, что и worker, и предупреждение должно исчезнуть.

...