Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. it troubles me !!!! QserialPort

it troubles me !!!! QserialPort

Scheduled Pinned Locked Moved Unsolved General and Desktop
11 Posts 4 Posters 2.1k Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • Q Offline
    Q Offline
    quelle.shen
    wrote on last edited by
    #1

    a thread problme appear in my code
    STATUS/1 @ init, L120: BaudRate: 230400QObject: Cannot create children for a parent that is in a different thread.
    (Parent is QSerialPort(0x2952c7b8), parent's thread is QThread(0x259e38f0), current thread is QThread(0x14cc2e0)

    my code :
    HardDriver*
    PlatformManager::addHardDriver(uint8_t driver_type, const char* device_port,
    uint32_t baudrate)
    {
    #ifdef QT
    if (driver_type == PlatformManager::SERIAL_DEVICE)
    {

    QThread*     serialEventThread = new QThread;
    QHardDriver* driver            = new QHardDriver(0, device_port, baudrate);
    driver->moveToThread(serialEventThread);
    QObject::connect(serialEventThread, SIGNAL(started()), driver,
                     SLOT(init()));
    QObject::connect(serialEventThread, SIGNAL(finished()), serialEventThread,
                     SLOT(deleteLater()));
    serialEventThread->start();
    QThread::msleep(100);
    return driver;
    

    }


    void
    QHardDriver::init()
    {
    initLock.lock();
    if (this->getDeviceStatus())
    {
    initLock.unlock();
    return;
    }

    port = new QSerialPort(QString(portName));
    if (port != 0)
    {
    if (port->isOpen())
    port->close();
    port->setBaudRate(baudrate);
    port->setParity(QSerialPort::NoParity);
    port->setDataBits(QSerialPort::Data8);
    port->setStopBits(QSerialPort::OneStop);
    port->setFlowControl(QSerialPort::NoFlowControl);
    if (port->open(QIODevice::ReadWrite))
    {
    DSTATUS("port %s open success", port->portName().toLocal8Bit().data());
    setDeviceStatus(true);
    DSTATUS("Read buf size: %d", port->readBufferSize());
    }
    else
    {
    DERROR("fail to open port %s", port->portName().toLocal8Bit().data());
    setDeviceStatus(false);
    }
    DSTATUS("BaudRate: %d", port->baudRate());
    }
    initLock.unlock();
    }


    but run there it throws a problem
    //! Serial Device call: last link in the send pipeline
    DERROR("*****1");
    ans = deviceDriver->send(buf, pHeader->length); // throws Cannot create children for a parent that is in a different thread.
    //(Parent is QSerialPort(0x2952c7b8), parent's thread is
    //QThread(0x259e38f0), current thread is QThread(0x14cc2e0)

    Q 1 Reply Last reply
    0
    • Q quelle.shen

      a thread problme appear in my code
      STATUS/1 @ init, L120: BaudRate: 230400QObject: Cannot create children for a parent that is in a different thread.
      (Parent is QSerialPort(0x2952c7b8), parent's thread is QThread(0x259e38f0), current thread is QThread(0x14cc2e0)

      my code :
      HardDriver*
      PlatformManager::addHardDriver(uint8_t driver_type, const char* device_port,
      uint32_t baudrate)
      {
      #ifdef QT
      if (driver_type == PlatformManager::SERIAL_DEVICE)
      {

      QThread*     serialEventThread = new QThread;
      QHardDriver* driver            = new QHardDriver(0, device_port, baudrate);
      driver->moveToThread(serialEventThread);
      QObject::connect(serialEventThread, SIGNAL(started()), driver,
                       SLOT(init()));
      QObject::connect(serialEventThread, SIGNAL(finished()), serialEventThread,
                       SLOT(deleteLater()));
      serialEventThread->start();
      QThread::msleep(100);
      return driver;
      

      }


      void
      QHardDriver::init()
      {
      initLock.lock();
      if (this->getDeviceStatus())
      {
      initLock.unlock();
      return;
      }

      port = new QSerialPort(QString(portName));
      if (port != 0)
      {
      if (port->isOpen())
      port->close();
      port->setBaudRate(baudrate);
      port->setParity(QSerialPort::NoParity);
      port->setDataBits(QSerialPort::Data8);
      port->setStopBits(QSerialPort::OneStop);
      port->setFlowControl(QSerialPort::NoFlowControl);
      if (port->open(QIODevice::ReadWrite))
      {
      DSTATUS("port %s open success", port->portName().toLocal8Bit().data());
      setDeviceStatus(true);
      DSTATUS("Read buf size: %d", port->readBufferSize());
      }
      else
      {
      DERROR("fail to open port %s", port->portName().toLocal8Bit().data());
      setDeviceStatus(false);
      }
      DSTATUS("BaudRate: %d", port->baudRate());
      }
      initLock.unlock();
      }


      but run there it throws a problem
      //! Serial Device call: last link in the send pipeline
      DERROR("*****1");
      ans = deviceDriver->send(buf, pHeader->length); // throws Cannot create children for a parent that is in a different thread.
      //(Parent is QSerialPort(0x2952c7b8), parent's thread is
      //QThread(0x259e38f0), current thread is QThread(0x14cc2e0)

      Q Offline
      Q Offline
      quelle.shen
      wrote on last edited by quelle.shen
      #2
      This post is deleted!
      1 Reply Last reply
      0
      • SGaistS Offline
        SGaistS Offline
        SGaist
        Lifetime Qt Champion
        wrote on last edited by
        #3

        Hi and welcome to devnet,

        What does happen in deviceDriver->send ?
        Where are you calling if from ?

        What version of Qt are you using ?
        What OS are you running ?

        Interested in AI ? www.idiap.ch
        Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

        1 Reply Last reply
        1
        • Q Offline
          Q Offline
          quelle.shen
          wrote on last edited by
          #4

          hi ~ thank you first
          it works on windows QT5.1

          HardDriver* deviceDriver;
          QHardDriver::send(const uint8_t* buf, size_t len)
          {
          sendLock.lock();
          size_t sent = 0;
          if (port != 0)
          {
          // if (port->isOpen())
          while (sent != len)
          {
          sent += port->write(reinterpret_cast<const char*>(buf + sent), len);
          port->waitForBytesWritten(2);
          }
          sendLock.unlock();
          return sent;
          }
          else
          {
          sendLock.unlock();
          return 0;
          }
          sendLock.unlock();
          return sent;
          }

          aha_1980A 1 Reply Last reply
          0
          • Q quelle.shen

            hi ~ thank you first
            it works on windows QT5.1

            HardDriver* deviceDriver;
            QHardDriver::send(const uint8_t* buf, size_t len)
            {
            sendLock.lock();
            size_t sent = 0;
            if (port != 0)
            {
            // if (port->isOpen())
            while (sent != len)
            {
            sent += port->write(reinterpret_cast<const char*>(buf + sent), len);
            port->waitForBytesWritten(2);
            }
            sendLock.unlock();
            return sent;
            }
            else
            {
            sendLock.unlock();
            return 0;
            }
            sendLock.unlock();
            return sent;
            }

            aha_1980A Offline
            aha_1980A Offline
            aha_1980
            Lifetime Qt Champion
            wrote on last edited by
            #5

            @quelle.shen said in it troubles me !!!! QserialPort:

            it works on windows QT5.1

            QSerialPort was very new in Qt 5.1. I strongly recommend updating to a newer version.

            That may not solve your problem, but avoid others.

            Qt has to stay free or it will die.

            Q 1 Reply Last reply
            0
            • aha_1980A aha_1980

              @quelle.shen said in it troubles me !!!! QserialPort:

              it works on windows QT5.1

              QSerialPort was very new in Qt 5.1. I strongly recommend updating to a newer version.

              That may not solve your problem, but avoid others.

              Q Offline
              Q Offline
              quelle.shen
              wrote on last edited by
              #6

              @aha_1980
              maybe you are right ,but i have to run it on Qt5.1
              the problem still troubles me !!

              1 Reply Last reply
              0
              • SGaistS Offline
                SGaistS Offline
                SGaist
                Lifetime Qt Champion
                wrote on last edited by
                #7

                You seem to move your serial port stuff in another thread and then calling its methods directly, is that the case ?

                Interested in AI ? www.idiap.ch
                Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                Q 2 Replies Last reply
                0
                • SGaistS SGaist

                  You seem to move your serial port stuff in another thread and then calling its methods directly, is that the case ?

                  Q Offline
                  Q Offline
                  quelle.shen
                  wrote on last edited by
                  #8

                  @SGaist
                  yes ,but i dont know how to revision my code.

                  1 Reply Last reply
                  0
                  • SGaistS SGaist

                    You seem to move your serial port stuff in another thread and then calling its methods directly, is that the case ?

                    Q Offline
                    Q Offline
                    quelle.shen
                    wrote on last edited by
                    #9

                    @SGaist
                    why just call port->write() will trows the problem ?
                    i add some code but it doesnt work .
                    i add code :


                    QThread* serialEventThread = new QThread;
                    QHardDriver* driver = new QHardDriver(0, device_port, baudrate);
                    //driver->init();
                    driver->moveToThread(serialEventThread);
                    driver->port->moveToThread(serialEventThread);
                    //Qt:: DirectConnection
                    QObject::connect(serialEventThread, SIGNAL(started()), driver,
                    SLOT(init()));
                    QObject::connect(serialEventThread, SIGNAL(finished()), driver, SLOT(deleteLater()));
                    QObject::connect(serialEventThread, SIGNAL(finished()), serialEventThread,
                    SLOT(deleteLater()));
                    serialEventThread->start();
                    QThread::msleep(100);
                    return driver;


                    1 Reply Last reply
                    0
                    • C Offline
                      C Offline
                      code_fodder
                      wrote on last edited by code_fodder
                      #10

                      @quelle.shen said in it troubles me !!!! QserialPort:

                      QObject::connect(serialEventThread, SIGNAL(started()), driver,
                      SLOT(init()));

                      From our direct messages...

                      hmm.... When you call deviceDriver->send(), I assume that send() is a member of deviceDriver?. But deviceDriver is in a different thread! in addHardDriver() you return a device driver that was moved to a different thread. What you need to do now is create another slot/signal connection to send your write-data to your device driver via a call to a signal. Somthing like: QObject::connect(this, SIGNAL(send_to_driver(QVector data)), driver,SLOT(data_to_send(QVector data))); Then instead of doing driver->write() you do send_to_driver(data). I used QVector in my example - not but you can put what ever Q<data type> you want...

                      Note: You cannot ever safely call members directly in the device driver ever again once you have moved it into another thread :p ... this is exactly what slot/signals are for. Doing so breaks the thread boundaries and Qt rightfully complains. If you call a member function directly then everything that occurs in that function call occurs in the calling thread and not the thread that you moved that class into. Does that make sense?

                      Q 1 Reply Last reply
                      2
                      • C code_fodder

                        @quelle.shen said in it troubles me !!!! QserialPort:

                        QObject::connect(serialEventThread, SIGNAL(started()), driver,
                        SLOT(init()));

                        From our direct messages...

                        hmm.... When you call deviceDriver->send(), I assume that send() is a member of deviceDriver?. But deviceDriver is in a different thread! in addHardDriver() you return a device driver that was moved to a different thread. What you need to do now is create another slot/signal connection to send your write-data to your device driver via a call to a signal. Somthing like: QObject::connect(this, SIGNAL(send_to_driver(QVector data)), driver,SLOT(data_to_send(QVector data))); Then instead of doing driver->write() you do send_to_driver(data). I used QVector in my example - not but you can put what ever Q<data type> you want...

                        Note: You cannot ever safely call members directly in the device driver ever again once you have moved it into another thread :p ... this is exactly what slot/signals are for. Doing so breaks the thread boundaries and Qt rightfully complains. If you call a member function directly then everything that occurs in that function call occurs in the calling thread and not the thread that you moved that class into. Does that make sense?

                        Q Offline
                        Q Offline
                        quelle.shen
                        wrote on last edited by
                        #11

                        @code_fodder
                        thanks reply for my question ,you are right .
                        i think your advice is good way to solve my problem .

                        1 Reply Last reply
                        0

                        • Login

                        • Login or register to search.
                        • First post
                          Last post
                        0
                        • Categories
                        • Recent
                        • Tags
                        • Popular
                        • Users
                        • Groups
                        • Search
                        • Get Qt Extensions
                        • Unsolved