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. Create object in another object
Forum Updated to NodeBB v4.3 + New Features

Create object in another object

Scheduled Pinned Locked Moved Solved General and Desktop
27 Posts 4 Posters 2.5k Views
  • 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.
  • D Offline
    D Offline
    Damian7546
    wrote on 1 Dec 2022, 07:16 last edited by
    #12

    I would like to separate above task form others. This project is for learning programming purposes only.
    In my example using thread it is a mistake ?

    J C 2 Replies Last reply 1 Dec 2022, 07:19
    0
    • D Damian7546
      1 Dec 2022, 07:16

      I would like to separate above task form others. This project is for learning programming purposes only.
      In my example using thread it is a mistake ?

      J Offline
      J Offline
      jsulm
      Lifetime Qt Champion
      wrote on 1 Dec 2022, 07:19 last edited by
      #13

      @Damian7546 said in Create object in another object:

      In my example using thread it is a mistake ?

      You should avoid threads if they are not needed as it is easy to do mistakes and the code becomes more complex. As I wrote: Qt is an asynchronous framework, that means you usually do not need threads. QSerialPort is also asynchronous - you can use it without threads and it will still not block your main thread. Threads are usually used to move heavy calculations to other threads, but I don't see any heavy calculations in your code.

      https://forum.qt.io/topic/113070/qt-code-of-conduct

      1 Reply Last reply
      0
      • D Damian7546
        1 Dec 2022, 07:16

        I would like to separate above task form others. This project is for learning programming purposes only.
        In my example using thread it is a mistake ?

        C Online
        C Online
        Christian Ehrlicher
        Lifetime Qt Champion
        wrote on 1 Dec 2022, 07:22 last edited by
        #14

        @Damian7546 said in Create object in another object:

        This project is for learning programming purposes only

        Then start with writing clean code without threads. Write a good handler class to handle your incoming data. Once this is done this class can be easily moved into a separate thread if really needed.

        Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
        Visit the Qt Academy at https://academy.qt.io/catalog

        1 Reply Last reply
        1
        • D Offline
          D Offline
          Damian7546
          wrote on 1 Dec 2022, 07:27 last edited by
          #15

          anyway, can anyone demonstrate why the above code doesn't work when created from the constructor? but works with the main.cpp one?

          J 1 Reply Last reply 1 Dec 2022, 07:30
          0
          • D Damian7546
            1 Dec 2022, 07:27

            anyway, can anyone demonstrate why the above code doesn't work when created from the constructor? but works with the main.cpp one?

            J Offline
            J Offline
            jsulm
            Lifetime Qt Champion
            wrote on 1 Dec 2022, 07:30 last edited by
            #16

            @Damian7546 If your application crashes then the first thing to do is: use the debugger.
            So, please run your app in debugger and post the stack trace after the crash here...

            https://forum.qt.io/topic/113070/qt-code-of-conduct

            1 Reply Last reply
            0
            • C Online
              C Online
              Christian Ehrlicher
              Lifetime Qt Champion
              wrote on 1 Dec 2022, 07:38 last edited by
              #17

              Your code crashes in the dtor of RfidSerialWorker (if doWork() would reach it's end), also it's using a blocking approach instead signals and slots to wait for data, the strange while(1) - loop does never exits and at last ít's accessing outFrameQueue from two different threads without proper locking mechanisms (and before you ask - read and understand at least https://doc.qt.io/qt-6/threads-synchronizing.html before fiddling around with threads for no reason).

              Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
              Visit the Qt Academy at https://academy.qt.io/catalog

              1 Reply Last reply
              2
              • D Offline
                D Offline
                Damian7546
                wrote on 1 Dec 2022, 07:53 last edited by
                #18

                @Christian-Ehrlicher so I will do like you propose.

                1 Reply Last reply
                0
                • D Offline
                  D Offline
                  Damian7546
                  wrote on 1 Dec 2022, 09:45 last edited by Damian7546 12 Jan 2022, 09:49
                  #19

                  I think that no a problem with thread.

                  I remove thread and create my object like below:

                    QQueue<RfidFrame*> outFrameQueue;
                      RfidSerialWorker *rfidSerialWorker = new RfidSerialWorker(&outFrameQueue);
                      RfidFrameProcessor *rfidFrameProcessor = new RfidFrameProcessor(&outFrameQueue);
                  
                      connect(rfidSerialWorker, SIGNAL(frameReceived(RfidFrame*)), rfidFrameProcessor, SLOT(FrameIncoming(RfidFrame*)));
                      connect(rfidFrameProcessor, SIGNAL(frameSend()), rfidSerialWorker, SLOT(frameToSend()));
                      rfidSerialWorker->initSerialPort();
                  
                      //tests - try send frame cyclically
                      QTimer *timer = new QTimer(this);
                      QObject::connect(timer, SIGNAL(timeout()), rfidFrameProcessor , SLOT(update_power_ind()));
                      timer->start(2000);
                  

                  Function which one try send frame is below:

                  void RfidFrameProcessor::update_power_ind()
                  {
                      readSourceRSx(1,9);
                  }
                  void RfidFrameProcessor::readSourceRSx(quint8 addr, quint8 source)
                  {
                  
                      QByteArray data;
                      data.append(source);
                      RfidFrame *frameToSend = new RfidFrame(addr, C_ReadSourceRSx, data);
                      qDebug() << "Get lenght from frameToSend: " << frameToSend->GetDataLength();
                      m_outFrameQueue->enqueue(frameToSend);
                      emit frameSend();
                  
                  }
                  

                  and problem is in the same step:
                  m_outFrameQueue->enqueue(frameToSend); despite the fact that in frameToSend I have data like you can see in below in Application Output.

                  zz.jpg

                  J J 2 Replies Last reply 1 Dec 2022, 09:49
                  0
                  • D Damian7546
                    1 Dec 2022, 09:45

                    I think that no a problem with thread.

                    I remove thread and create my object like below:

                      QQueue<RfidFrame*> outFrameQueue;
                        RfidSerialWorker *rfidSerialWorker = new RfidSerialWorker(&outFrameQueue);
                        RfidFrameProcessor *rfidFrameProcessor = new RfidFrameProcessor(&outFrameQueue);
                    
                        connect(rfidSerialWorker, SIGNAL(frameReceived(RfidFrame*)), rfidFrameProcessor, SLOT(FrameIncoming(RfidFrame*)));
                        connect(rfidFrameProcessor, SIGNAL(frameSend()), rfidSerialWorker, SLOT(frameToSend()));
                        rfidSerialWorker->initSerialPort();
                    
                        //tests - try send frame cyclically
                        QTimer *timer = new QTimer(this);
                        QObject::connect(timer, SIGNAL(timeout()), rfidFrameProcessor , SLOT(update_power_ind()));
                        timer->start(2000);
                    

                    Function which one try send frame is below:

                    void RfidFrameProcessor::update_power_ind()
                    {
                        readSourceRSx(1,9);
                    }
                    void RfidFrameProcessor::readSourceRSx(quint8 addr, quint8 source)
                    {
                    
                        QByteArray data;
                        data.append(source);
                        RfidFrame *frameToSend = new RfidFrame(addr, C_ReadSourceRSx, data);
                        qDebug() << "Get lenght from frameToSend: " << frameToSend->GetDataLength();
                        m_outFrameQueue->enqueue(frameToSend);
                        emit frameSend();
                    
                    }
                    

                    and problem is in the same step:
                    m_outFrameQueue->enqueue(frameToSend); despite the fact that in frameToSend I have data like you can see in below in Application Output.

                    zz.jpg

                    J Offline
                    J Offline
                    jsulm
                    Lifetime Qt Champion
                    wrote on 1 Dec 2022, 09:49 last edited by
                    #20

                    @Damian7546 said in Create object in another object:

                    and problem is in the same step

                    And again: is m_outFrameQueue a valid pointer?

                    https://forum.qt.io/topic/113070/qt-code-of-conduct

                    D 1 Reply Last reply 1 Dec 2022, 09:53
                    0
                    • J jsulm
                      1 Dec 2022, 09:49

                      @Damian7546 said in Create object in another object:

                      and problem is in the same step

                      And again: is m_outFrameQueue a valid pointer?

                      D Offline
                      D Offline
                      Damian7546
                      wrote on 1 Dec 2022, 09:53 last edited by
                      #21

                      @jsulm In my opinion yes, but I am beginner.... Please explain me.
                      .h

                      class RfidFrameProcessor : public QObject
                      {
                          Q_OBJECT
                      public:
                          explicit RfidFrameProcessor(QQueue<RfidFrame*> *outFrameQueue, QObject *parent = nullptr);
                      private:
                          QQueue<RfidFrame*> *m_outFrameQueue;
                      }
                      
                      

                      .cpp

                      RfidFrameProcessor::RfidFrameProcessor(QQueue<RfidFrame*> *outFrameQueue,QObject *parent)
                          : QObject(parent)
                      {
                          m_outFrameQueue = outFrameQueue;
                      }
                      
                      J 1 Reply Last reply 1 Dec 2022, 09:54
                      0
                      • D Damian7546
                        1 Dec 2022, 09:53

                        @jsulm In my opinion yes, but I am beginner.... Please explain me.
                        .h

                        class RfidFrameProcessor : public QObject
                        {
                            Q_OBJECT
                        public:
                            explicit RfidFrameProcessor(QQueue<RfidFrame*> *outFrameQueue, QObject *parent = nullptr);
                        private:
                            QQueue<RfidFrame*> *m_outFrameQueue;
                        }
                        
                        

                        .cpp

                        RfidFrameProcessor::RfidFrameProcessor(QQueue<RfidFrame*> *outFrameQueue,QObject *parent)
                            : QObject(parent)
                        {
                            m_outFrameQueue = outFrameQueue;
                        }
                        
                        J Offline
                        J Offline
                        jsulm
                        Lifetime Qt Champion
                        wrote on 1 Dec 2022, 09:54 last edited by
                        #22

                        @Damian7546 said in Create object in another object:

                        m_outFrameQueue = outFrameQueue;

                        I laready asked that before: is outFrameQueue a valid pointer?

                        https://forum.qt.io/topic/113070/qt-code-of-conduct

                        1 Reply Last reply
                        0
                        • D Offline
                          D Offline
                          Damian7546
                          wrote on 1 Dec 2022, 10:00 last edited by Damian7546 12 Jan 2022, 10:06
                          #23

                          Ok,
                          I create in this way:

                           QQueue<RfidFrame*> outFrameQueue;
                              RfidSerialWorker *rfidSerialWorker = new RfidSerialWorker(&outFrameQueue);
                              RfidFrameProcessor *rfidFrameProcessor = new RfidFrameProcessor(&outFrameQueue);
                          

                          But in class

                             Q_OBJECT
                          public:
                              explicit RfidFrameProcessor(QQueue<RfidFrame*> *outFrameQueue, QObject *parent = nullptr);
                          private:
                              QQueue<RfidFrame*> *m_outFrameQueue;
                          
                          1 Reply Last reply
                          0
                          • D Damian7546
                            1 Dec 2022, 09:45

                            I think that no a problem with thread.

                            I remove thread and create my object like below:

                              QQueue<RfidFrame*> outFrameQueue;
                                RfidSerialWorker *rfidSerialWorker = new RfidSerialWorker(&outFrameQueue);
                                RfidFrameProcessor *rfidFrameProcessor = new RfidFrameProcessor(&outFrameQueue);
                            
                                connect(rfidSerialWorker, SIGNAL(frameReceived(RfidFrame*)), rfidFrameProcessor, SLOT(FrameIncoming(RfidFrame*)));
                                connect(rfidFrameProcessor, SIGNAL(frameSend()), rfidSerialWorker, SLOT(frameToSend()));
                                rfidSerialWorker->initSerialPort();
                            
                                //tests - try send frame cyclically
                                QTimer *timer = new QTimer(this);
                                QObject::connect(timer, SIGNAL(timeout()), rfidFrameProcessor , SLOT(update_power_ind()));
                                timer->start(2000);
                            

                            Function which one try send frame is below:

                            void RfidFrameProcessor::update_power_ind()
                            {
                                readSourceRSx(1,9);
                            }
                            void RfidFrameProcessor::readSourceRSx(quint8 addr, quint8 source)
                            {
                            
                                QByteArray data;
                                data.append(source);
                                RfidFrame *frameToSend = new RfidFrame(addr, C_ReadSourceRSx, data);
                                qDebug() << "Get lenght from frameToSend: " << frameToSend->GetDataLength();
                                m_outFrameQueue->enqueue(frameToSend);
                                emit frameSend();
                            
                            }
                            

                            and problem is in the same step:
                            m_outFrameQueue->enqueue(frameToSend); despite the fact that in frameToSend I have data like you can see in below in Application Output.

                            zz.jpg

                            J Online
                            J Online
                            JonB
                            wrote on 1 Dec 2022, 10:06 last edited by JonB 12 Jan 2022, 10:08
                            #24

                            @Damian7546 said in Create object in another object:

                            QQueue<RfidFrame*> outFrameQueue;
                            RfidSerialWorker *rfidSerialWorker = new RfidSerialWorker(&outFrameQueue);
                            RfidFrameProcessor *rfidFrameProcessor = new RfidFrameProcessor(&outFrameQueue);
                            ...
                            timer->start(2000);
                            

                            If I understand your code right. QQueue<RfidFrame*> outFrameQueue is a local variable in some method? But once you have set off the timer you exit that method, right? So the QQueue<RfidFrame*> outFrameQueue goes out of scope and gets destroyed at that point. Yet you have passed that queue as a parameter to RfidSerialWorker/RfidFrameProcessor, they have set a m_outFrameQueue to point to that queue passed in, it is no longer valid, but they still use it => disaster. Is my analysis correct for your code?

                            I'm not sure, but it sounds like your QQueue<RfidFrame*> outFrameQueue; should not be local variable in a method but rather a persistent member variable?

                            1 Reply Last reply
                            1
                            • D Offline
                              D Offline
                              Damian7546
                              wrote on 1 Dec 2022, 10:13 last edited by
                              #25

                              Thanks QQueue<RfidFrame*> outFrameQueue i wolud like to pass frame to send beetwen RfidSerialWorker and RfidFrameProcessor.

                              @JonB said in Create object in another object:

                              I'm not sure, but it sounds like your QQueue<RfidFrame*> outFrameQueue; should not be local variable in a method but rather a persistent member variable?

                              Exactly. But how do this ?

                              J 1 Reply Last reply 1 Dec 2022, 10:13
                              0
                              • D Damian7546
                                1 Dec 2022, 10:13

                                Thanks QQueue<RfidFrame*> outFrameQueue i wolud like to pass frame to send beetwen RfidSerialWorker and RfidFrameProcessor.

                                @JonB said in Create object in another object:

                                I'm not sure, but it sounds like your QQueue<RfidFrame*> outFrameQueue; should not be local variable in a method but rather a persistent member variable?

                                Exactly. But how do this ?

                                J Offline
                                J Offline
                                jsulm
                                Lifetime Qt Champion
                                wrote on 1 Dec 2022, 10:13 last edited by
                                #26

                                @Damian7546 said in Create object in another object:

                                But how do this ?

                                Make outFrameQueue member variable instead of local variable.

                                https://forum.qt.io/topic/113070/qt-code-of-conduct

                                1 Reply Last reply
                                1
                                • D Offline
                                  D Offline
                                  Damian7546
                                  wrote on 1 Dec 2022, 10:18 last edited by
                                  #27

                                  sure!! Thank you !

                                  1 Reply Last reply
                                  0

                                  21/27

                                  1 Dec 2022, 09:53

                                  • Login

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