Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Mobile and Embedded
  4. Thread that read from QSerialPort
Forum Updated to NodeBB v4.3 + New Features

Thread that read from QSerialPort

Scheduled Pinned Locked Moved Mobile and Embedded
21 Posts 4 Posters 12.9k 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.
  • JKSHJ Offline
    JKSHJ Offline
    JKSH
    Moderators
    wrote on last edited by
    #7

    [quote author="rileo8" date="1383208867"]that enters the event loop and waits until exit() is calle

    Is it correct?[/quote]Yes, it's correct :)

    Next, read the "Thread Affinity" section of the "QObject documentation":http://doc-snapshot.qt-project.org/qt5-stable/qobject.html#thread-affinity -- it explains how to choose the thread to run your slots.

    [quote author="t3685" date="1383215445"]No it is not correct. You don't need a wait loop like that.[/quote]rileo8 realized that after reading the documentation. That's why he asked if it's correct to replace the wait loop with exec().

    Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

    1 Reply Last reply
    0
    • R Offline
      R Offline
      rileo8
      wrote on last edited by
      #8

      Ok,

      i'm understanding that i hadn;t understand qthreads before... :-)
      The question is :

      i need a "worker" thread that read and write from a serial port so i can use this approach:

      class Worker : public QObject
      {
      Q_OBJECT
      private slots:
      void onTimeout()
      {
      qDebug()<<"Worker::onTimeout get called from?: "<<QThread::currentThreadId();
      }
      };

      @class Thread : public QThread
      {
      Q_OBJECT

      private:
      void run()
      {
      qDebug()<<"From work thread: "<<currentThreadId();
      QTimer timer;
      Worker worker;
      connect(&timer, SIGNAL(timeout()), &worker, SLOT(onTimeout()));
      timer.start(1000);

          exec&#40;&#41;;
      }
      

      };@

      the problem is...if i need that the worker thread receive signals from the GUI what i have to do? Connect with signal&slot the GUI withe theThread class and then connect always with signals/slot the thread calls with the worker class?

      1 Reply Last reply
      0
      • JKSHJ Offline
        JKSHJ Offline
        JKSH
        Moderators
        wrote on last edited by
        #9

        To make things simple, you don't need to subclass QThread. Just have the timer in your worker:

        @
        class Worker : public QObject
        {
        Q_OBJECT
        QTimer* timer;

        public:
        Worker(QObject *parent = 0) : QObject(parent) {
        // Worker must be parent of QTimer
        timer = new QTimer(this);
        connect(timer, SIGNAL(timeout()), this, SLOT(onTimeout()));
        }

        public slots:
        void startWorking() { timer->start(1000); }

        private slots:
        void onTimeout() {...}
        };
        @

        @
        int main(int argc, char *argv[]) {
        QApplication a(argc, argv);
        QThread thread;
        Worker worker;

        QObject::connect(&thread, SIGNAL(started()),
                &worker, SLOT(startWorking()));
        
        worker.moveToThread(&thread);
        thread.start();
        
        int returnValue = a.exec&#40;&#41;;
        thread.wait(&#41;;
        return returnValue;
        

        }
        @

        You can connect signals and slots directly between your worker and your GUI.

        Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

        1 Reply Last reply
        0
        • R Offline
          R Offline
          rileo8
          wrote on last edited by
          #10

          Ok perfect,thanks to everybody for the help!
          Now i better understand Qthreads...

          1 Reply Last reply
          0
          • JKSHJ Offline
            JKSHJ Offline
            JKSH
            Moderators
            wrote on last edited by
            #11

            You're welcome.

            Good luck with your project!

            Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

            1 Reply Last reply
            0
            • R Offline
              R Offline
              rileo8
              wrote on last edited by
              #12

              Hi, i'm stille here with another question..

              now my code loooks like this:

              @#include "mainwindow.h"
              #include <QtGui/QApplication>
              #include <QThread>

              #include "executer.h"
              #include "checker.h"
              #include "networker.h"

              int main(int argc, char *argv[])
              {
              QApplication a(argc, argv);
              MainWindow w;
              w.showMaximized();

              Checker checker;
              Networker networker;
              Executer executer;

              QThread checkerThread;
              QThread networkerThread;
              QThread executerThread;

              QObject::connect(&executerThread,SIGNAL(started()),&executer,SLOT(Start()));

              checker.moveToThread(&checkerThread);
              networker.moveToThread(&networkerThread);
              executer.moveToThread(&executerThread);

              checkerThread.start();
              networkerThread.start();
              executerThread.start();

              int returnValue=a.exec();

              executerThread.wait();

              return returnValue;

              }
              @

              i neew to share an object (of a custom Configuration type) between all trheads.

              Is it coorect to declare it in the main, pass it to all htreads and also share a mutex so that every thread lock and unlock it?

              Thanks

              1 Reply Last reply
              0
              • JKSHJ Offline
                JKSHJ Offline
                JKSH
                Moderators
                wrote on last edited by
                #13

                If it is not a QObject, then yes you can do that.

                If it is a QObject, then you are not allowed to share it between threads. QObject is not thread-safe.

                See this page for info on how to share data between threads: http://doc-snapshot.qt-project.org/qt5-stable/threads-synchronizing.html

                Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

                1 Reply Last reply
                0
                • T Offline
                  T Offline
                  t3685
                  wrote on last edited by
                  #14

                  [quote author="JKSH" date="1383215991"][quote author="rileo8" date="1383208867"]that enters the event loop and waits until exit() is calle

                  Is it correct?[/quote]Yes, it's correct :)

                  Next, read the "Thread Affinity" section of the "QObject documentation":http://doc-snapshot.qt-project.org/qt5-stable/qobject.html#thread-affinity -- it explains how to choose the thread to run your slots.

                  [quote author="t3685" date="1383215445"]No it is not correct. You don't need a wait loop like that.[/quote]rileo8 realized that after reading the documentation. That's why he asked if it's correct to replace the wait loop with exec().[/quote]

                  The QSerialPort class is asynchronous. You don't need threads to do this.

                  1 Reply Last reply
                  0
                  • R Offline
                    R Offline
                    rileo8
                    wrote on last edited by
                    #15

                    It is not a QObject, is a simple c++ custom class

                    1 Reply Last reply
                    0
                    • JKSHJ Offline
                      JKSHJ Offline
                      JKSH
                      Moderators
                      wrote on last edited by
                      #16

                      [quote author="t3685" date="1383225223"]The QSerialPort class is asynchronous. You don't need threads to do this.[/quote]Yes, if I/O is slow enough, then no threads are needed. That's why I asked about the read/write rate.

                      Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

                      1 Reply Last reply
                      0
                      • R Offline
                        R Offline
                        rileo8
                        wrote on last edited by
                        #17

                        Yes i understood this,
                        infact now i have:

                        GUI thread
                        thread for operations on serialport 1
                        thread for operations on serialport 2
                        thread for network operations

                        Now i also added a custom Configuration class that is share d between threads with a shared QMutex to enable access to it

                        1 Reply Last reply
                        0
                        • T Offline
                          T Offline
                          t3685
                          wrote on last edited by
                          #18

                          [quote author="JKSH" date="1383225543"][quote author="t3685" date="1383225223"]The QSerialPort class is asynchronous. You don't need threads to do this.[/quote]Yes, if I/O is slow enough, then no threads are needed. That's why I asked about the read/write rate.[/quote]

                          The write function returns immediately. The readyRead() signal is only emitted when data is available. I don't think it matters then what the Baud rate is.

                          http://qt-project.org/doc/qt-5.1/qtserialport/terminal.html

                          1 Reply Last reply
                          0
                          • JKSHJ Offline
                            JKSHJ Offline
                            JKSH
                            Moderators
                            wrote on last edited by
                            #19

                            [quote author="t3685" date="1383225815"]
                            The write function returns immediately. The readyRead() signal is only emitted when data is available. I don't think it matters then what the Baud rate is.[/quote]Sorry for being unclear; I meant the rate at which read() and write() need to be called (relative to other operations). An active thread will experience jitter, especially on a non-real-time OS. That raises the possibility of a buffer becoming empty. Depending on how the devices have been designed, an empty write buffer could kill the entire connection.

                            t3685 has a very valid point though. rileo8, try running your workers in the main thread first using the asynchronous API, and see how your program performs. You might not need 3 extra threads.

                            Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

                            1 Reply Last reply
                            0
                            • R Offline
                              R Offline
                              rileo8
                              wrote on last edited by
                              #20

                              Hi,

                              my point is that i need to accomplish different operations on 2 serial ports and also network operations so i think that putting all i t he gui can cause gui freezing...

                              1 Reply Last reply
                              0
                              • K Offline
                                K Offline
                                kuzulis
                                Qt Champions 2020
                                wrote on last edited by
                                #21

                                Hi guys,

                                the main point to use QtSerialPort's objects in different thread - a bug with the stopping of I/O at moving window or expanding window. Of course, this problem only in Windows OS. :)

                                [quote]

                                GUI thread

                                thread for operations on serialport 1

                                thread for operations on serialport 2

                                thread for network operations

                                [/quote]

                                IMHO, it is better:

                                1. GUI thread

                                2. thread for operations on serialport 1, serialport 2, network

                                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