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. Usage of QSerialport in a QThread (Cannot create children for a parent that is in a different thread)
Forum Updated to NodeBB v4.3 + New Features

Usage of QSerialport in a QThread (Cannot create children for a parent that is in a different thread)

Scheduled Pinned Locked Moved Solved General and Desktop
12 Posts 6 Posters 5.1k Views 1 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.
  • mrjjM mrjj

    Hi
    You seems to have killed by scope issue

    void MainWindow::process()
    {
        port = new Drive;
        QThread t2; <<<<< local variable. will die at last }
        port->moveToThread(&t2);
        t2.start();
    
        connect(this, &MainWindow::signalGetInfo, port, &Drive::connect_device, Qt::QueuedConnection);
        emit signalGetInfo();
    } // t2 is gone here
    
    R Offline
    R Offline
    robro
    wrote on last edited by robro
    #3

    @mrjj said in Usage of QSerialport in a QThread (Cannot create children for a parent that is in a different thread):

    Hi
    You seems to have killed by scope issue

    Hi,
    thanks for pointing out this issue!
    I now added the thread as a member variable and changed the timer to single shot.

    The issue is still there.
    The following line leads to the error:

    device->open(QSerialPort::ReadWrite);
    

    The error only occurs if an existing serial port is opened.
    If I put a random string as port name no error is showing up.

    Any ideas?

    J.HilkJ 1 Reply Last reply
    0
    • R robro

      @mrjj said in Usage of QSerialport in a QThread (Cannot create children for a parent that is in a different thread):

      Hi
      You seems to have killed by scope issue

      Hi,
      thanks for pointing out this issue!
      I now added the thread as a member variable and changed the timer to single shot.

      The issue is still there.
      The following line leads to the error:

      device->open(QSerialPort::ReadWrite);
      

      The error only occurs if an existing serial port is opened.
      If I put a random string as port name no error is showing up.

      Any ideas?

      J.HilkJ Offline
      J.HilkJ Offline
      J.Hilk
      Moderators
      wrote on last edited by J.Hilk
      #4

      @robro
      Couple of things,

      first give your Serialport a parent, so it get moved also to the thread

      new QSerialPort(this);

      second
      your QTimer is going to create a new serialport class and thread each second
      you should change that.


      Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


      Q: What's that?
      A: It's blue light.
      Q: What does it do?
      A: It turns blue.

      T 1 Reply Last reply
      5
      • R Offline
        R Offline
        robro
        wrote on last edited by
        #5

        The timer issue I already noticed and changed.

        Thank you all very much!
        Giving it a parent solved it!

        I have to say, you saved my day :-)

        1 Reply Last reply
        2
        • J.HilkJ J.Hilk

          @robro
          Couple of things,

          first give your Serialport a parent, so it get moved also to the thread

          new QSerialPort(this);

          second
          your QTimer is going to create a new serialport class and thread each second
          you should change that.

          T Offline
          T Offline
          Thanh Tung
          wrote on last edited by
          #6

          @J-Hilk
          i have the same problem and i just try to use Qt, so i don't so much
          can you explain more about:

          first give your Serialport a parent, so it get moved also to the thread
          second
          your QTimer is going to create a new serialport class and thread each second
          you should change that

          and how i can do it??
          thank you!!

          aha_1980A J.HilkJ 2 Replies Last reply
          0
          • T Thanh Tung

            @J-Hilk
            i have the same problem and i just try to use Qt, so i don't so much
            can you explain more about:

            first give your Serialport a parent, so it get moved also to the thread
            second
            your QTimer is going to create a new serialport class and thread each second
            you should change that

            and how i can do it??
            thank you!!

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

            @Thanh-Tung why do you need a thread at all?

            just use QSerialPort with signals&slots - and without a thread.

            Regards

            Qt has to stay free or it will die.

            T 1 Reply Last reply
            1
            • aha_1980A aha_1980

              @Thanh-Tung why do you need a thread at all?

              just use QSerialPort with signals&slots - and without a thread.

              Regards

              T Offline
              T Offline
              Thanh Tung
              wrote on last edited by
              #8

              @aha_1980 i need thread because i have a button1 that will run a while loop to communicate with device through serial port, and button2 that will run a another thread( this thread also use serial port, so a need kill the thread of button 1).

              aha_1980A 1 Reply Last reply
              0
              • T Thanh Tung

                @aha_1980 i need thread because i have a button1 that will run a while loop to communicate with device through serial port, and button2 that will run a another thread( this thread also use serial port, so a need kill the thread of button 1).

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

                @Thanh-Tung said in Usage of QSerialport in a QThread (Cannot create children for a parent that is in a different thread):

                i have a button1 that will run a while loop to communicate with device through serial port, and button2 that will run a another thread( this thread also use serial port, so a need kill the thread of button 1).

                That sounds like a horrible design - you should overthink it.

                As said, you don't need threads, as QSerialPort is asynchronous. Just use the signals bytesWritten and readyRead. See for example here: https://doc.qt.io/qt-5/qtserialport-terminal-example.html

                Regards

                Qt has to stay free or it will die.

                1 Reply Last reply
                3
                • T Thanh Tung

                  @J-Hilk
                  i have the same problem and i just try to use Qt, so i don't so much
                  can you explain more about:

                  first give your Serialport a parent, so it get moved also to the thread
                  second
                  your QTimer is going to create a new serialport class and thread each second
                  you should change that

                  and how i can do it??
                  thank you!!

                  J.HilkJ Offline
                  J.HilkJ Offline
                  J.Hilk
                  Moderators
                  wrote on last edited by
                  #10

                  hello @Thanh-Tung and welcome.

                  @Thanh-Tung said in Usage of QSerialport in a QThread (Cannot create children for a parent that is in a different thread):

                  @J-Hilk
                  i have the same problem and i just try to use Qt, so i don't so much
                  can you explain more about:

                  first give your Serialport a parent, so it get moved also to the thread
                  second

                  Here is the thing, if you don't know what the parent child relationship in Qt is, you should not attempt using multiple threads. IMHO.

                  Take a look at the documentation:
                  https://doc.qt.io/qt-5/qtcore-index.html
                  and especially
                  https://doc.qt.io/qt-5/objecttrees.html

                  your QTimer is going to create a new serialport class and thread each second
                  you should change that

                  and how i can do it??
                  thank you!!

                  You need to freshen up your C++ knowledge! Are you new to programming in general ?

                  new is a key word in almost all programming languages - that I use/know of at least - that indicates a the. creation of a new object.
                  https://en.cppreference.com/w/cpp/language/new

                  So when you new an object (QSerialPort in this case) the object is created and the pointer is stored in a variable, in this example.
                  BUT just because you assign a new object to the old variable does not mean that the old object is destroyed!!! In fact it's still there, taking up memory.
                  Or worse, in your case where you have infinite while loops running, its not only taking up memory but cpu time as well, keeping the os busy with thread swapping and consumes electricity. DON'T do it!

                  c++ does not have fancy garbage collectors like python/JS etc. YOU have to manage your own garbage!

                  To get back to your question:
                  @robro wrote:

                  QTimer *timer = new QTimer(this);
                          connect(timer, SIGNAL(timeout()), this, SLOT(process()));
                          timer->start(1000);
                  
                  ....
                  void MainWindow::process()
                  {
                      port = new Drive;
                      QThread t2;
                      port->moveToThread(&t2);
                      t2.start();
                  
                      connect(this, &MainWindow::signalGetInfo, port, &Drive::connect_device, Qt::QueuedConnection);
                      emit signalGetInfo();
                  }
                  

                  timer is QTimer object that is created on start up of the class and will call every 1000ms the slot process -> each second port = new Drive; is executed -> each second a new Drive instance is created and the old one not deleted.

                  If you're not running a microcontroller, but have an over arching operating system than there is no reason to not use the asynchronous api of QSerialPort.

                  I still have hope that the synchronous api will be removed in Qt6. @aha_1980 please make it happen 😉🙏


                  Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


                  Q: What's that?
                  A: It's blue light.
                  Q: What does it do?
                  A: It turns blue.

                  A 1 Reply Last reply
                  4
                  • J.HilkJ J.Hilk

                    hello @Thanh-Tung and welcome.

                    @Thanh-Tung said in Usage of QSerialport in a QThread (Cannot create children for a parent that is in a different thread):

                    @J-Hilk
                    i have the same problem and i just try to use Qt, so i don't so much
                    can you explain more about:

                    first give your Serialport a parent, so it get moved also to the thread
                    second

                    Here is the thing, if you don't know what the parent child relationship in Qt is, you should not attempt using multiple threads. IMHO.

                    Take a look at the documentation:
                    https://doc.qt.io/qt-5/qtcore-index.html
                    and especially
                    https://doc.qt.io/qt-5/objecttrees.html

                    your QTimer is going to create a new serialport class and thread each second
                    you should change that

                    and how i can do it??
                    thank you!!

                    You need to freshen up your C++ knowledge! Are you new to programming in general ?

                    new is a key word in almost all programming languages - that I use/know of at least - that indicates a the. creation of a new object.
                    https://en.cppreference.com/w/cpp/language/new

                    So when you new an object (QSerialPort in this case) the object is created and the pointer is stored in a variable, in this example.
                    BUT just because you assign a new object to the old variable does not mean that the old object is destroyed!!! In fact it's still there, taking up memory.
                    Or worse, in your case where you have infinite while loops running, its not only taking up memory but cpu time as well, keeping the os busy with thread swapping and consumes electricity. DON'T do it!

                    c++ does not have fancy garbage collectors like python/JS etc. YOU have to manage your own garbage!

                    To get back to your question:
                    @robro wrote:

                    QTimer *timer = new QTimer(this);
                            connect(timer, SIGNAL(timeout()), this, SLOT(process()));
                            timer->start(1000);
                    
                    ....
                    void MainWindow::process()
                    {
                        port = new Drive;
                        QThread t2;
                        port->moveToThread(&t2);
                        t2.start();
                    
                        connect(this, &MainWindow::signalGetInfo, port, &Drive::connect_device, Qt::QueuedConnection);
                        emit signalGetInfo();
                    }
                    

                    timer is QTimer object that is created on start up of the class and will call every 1000ms the slot process -> each second port = new Drive; is executed -> each second a new Drive instance is created and the old one not deleted.

                    If you're not running a microcontroller, but have an over arching operating system than there is no reason to not use the asynchronous api of QSerialPort.

                    I still have hope that the synchronous api will be removed in Qt6. @aha_1980 please make it happen 😉🙏

                    A Offline
                    A Offline
                    Astrinus
                    wrote on last edited by
                    #11

                    @J-Hilk said in Usage of QSerialport in a QThread (Cannot create children for a parent that is in a different thread):

                    If you're not running a microcontroller, but have an over arching operating system than there is no reason to not use the asynchronous api of QSerialPort.

                    And if you are running onto a microcontroller and you are not bitbanging, you'd better implement an asynchronous interface to the serial port anyway ;-)

                    I still have hope that the synchronous api will be removed in Qt6. @aha_1980 please make it happen 😉🙏

                    Another vote!

                    1 Reply Last reply
                    0
                    • T Offline
                      T Offline
                      Thanh Tung
                      wrote on last edited by
                      #12

                      @aha_1980
                      Thanks for your advice, i may overthink about it, and now i use the Qtimer instead Qthread.
                      @J-Hilk
                      i usually use C and this is the first project i use C++ and Qt :)))
                      thanks you so much for your help and all your recommendation!!!

                      1 Reply Last reply
                      3

                      • Login

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