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 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