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.
  • Christian EhrlicherC Offline
    Christian EhrlicherC Offline
    Christian Ehrlicher
    Lifetime Qt Champion
    wrote on 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 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 last edited by Damian7546
        #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

        jsulmJ JonBJ 2 Replies Last reply
        0
        • D Damian7546

          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

          jsulmJ Offline
          jsulmJ Offline
          jsulm
          Lifetime Qt Champion
          wrote on 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
          0
          • jsulmJ jsulm

            @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 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;
            }
            
            jsulmJ 1 Reply Last reply
            0
            • D Damian7546

              @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;
              }
              
              jsulmJ Offline
              jsulmJ Offline
              jsulm
              Lifetime Qt Champion
              wrote on 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 last edited by Damian7546
                #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

                  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

                  JonBJ Offline
                  JonBJ Offline
                  JonB
                  wrote on last edited by JonB
                  #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 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 ?

                    jsulmJ 1 Reply Last reply
                    0
                    • D Damian7546

                      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 ?

                      jsulmJ Offline
                      jsulmJ Offline
                      jsulm
                      Lifetime Qt Champion
                      wrote on 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 last edited by
                        #27

                        sure!! Thank you !

                        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