Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. General talk
  3. Qt 6
  4. Qt6 Windows slower than Qt6 Ubuntu

Qt6 Windows slower than Qt6 Ubuntu

Scheduled Pinned Locked Moved Solved Qt 6
ubuntuwindows 10 instmsvcgccqt6
47 Posts 5 Posters 7.7k 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 Christian Ehrlicher

    ... And you should/must not recreate the QNetworkAcceesManager every time.

    J Offline
    J Offline
    Joe von Habsburg
    wrote on last edited by
    #17

    @Christian-Ehrlicher said in Qt6 Windows slower than Qt6 Ubuntu:

    And you should/must not recreate the QNetworkAcceesManager every time.

    This work for me. Thank you so much :)

    1 Reply Last reply
    0
    • Christian EhrlicherC Christian Ehrlicher

      ... And you should/must not recreate the QNetworkAcceesManager every time.

      J Offline
      J Offline
      Joe von Habsburg
      wrote on last edited by
      #18

      @Christian-Ehrlicher

      I have another question. I received some times between ubuntu and windows (65ms). Everything is ok. But, sometimes windows rising 350ms for one packet. In ubuntu just max 80ms.

      QByteArray DataReceiver::getData(int port)
      {
          QString url = QString("http://localhost:%1/sample").arg(port);
          _apiUrl.setUrl(url);
          _request.setUrl(_apiUrl);
          _reply = _manager.get(_request);
          connect(_reply, &QNetworkReply::finished, &_loop, &QEventLoop::quit);
          _loop.exec();
          if (_reply->error() == QNetworkReply::NoError) {
              QByteArray responseData = _reply->readAll();
              _reply->deleteLater();
              return responseData;
          } else {
              QString _error = tr("Error");
              QString _spectrum_error = tr("Spectrum error.");
              QMessageBox::critical(nullptr, _error, _spectrum_error);
              stop();
          }
          _reply->deleteLater();
          return NULL;
      }
      

      Do you know, why it's rising ? What can I do another, after take data ?

      J 1 Reply Last reply
      0
      • J Joe von Habsburg

        @Christian-Ehrlicher

        I have another question. I received some times between ubuntu and windows (65ms). Everything is ok. But, sometimes windows rising 350ms for one packet. In ubuntu just max 80ms.

        QByteArray DataReceiver::getData(int port)
        {
            QString url = QString("http://localhost:%1/sample").arg(port);
            _apiUrl.setUrl(url);
            _request.setUrl(_apiUrl);
            _reply = _manager.get(_request);
            connect(_reply, &QNetworkReply::finished, &_loop, &QEventLoop::quit);
            _loop.exec();
            if (_reply->error() == QNetworkReply::NoError) {
                QByteArray responseData = _reply->readAll();
                _reply->deleteLater();
                return responseData;
            } else {
                QString _error = tr("Error");
                QString _spectrum_error = tr("Spectrum error.");
                QMessageBox::critical(nullptr, _error, _spectrum_error);
                stop();
            }
            _reply->deleteLater();
            return NULL;
        }
        

        Do you know, why it's rising ? What can I do another, after take data ?

        J Offline
        J Offline
        Joe von Habsburg
        wrote on last edited by
        #19

        @Joe-von-Habsburg I found the reason. Thanks a lot :) <3

        V 1 Reply Last reply
        0
        • J Joe von Habsburg

          @Joe-von-Habsburg I found the reason. Thanks a lot :) <3

          V Offline
          V Offline
          Volker75
          wrote on last edited by
          #20

          @Joe-von-Habsburg And what was the reason? Windows defender?

          J 1 Reply Last reply
          0
          • V Volker75

            @Joe-von-Habsburg And what was the reason? Windows defender?

            J Offline
            J Offline
            Joe von Habsburg
            wrote on last edited by Joe von Habsburg
            #21

            @Volker75 said in Qt6 Windows slower than Qt6 Ubuntu:

            And what was the reason? Windows defender?

            another networkmanager.....

            @Christian-Ehrlicher , @JonB , @jsulm

            Hi guys, I need your help. When I run the my program (only data receive) after 30min, my ram will be 20gb. It's increase always. I tested it in Ubuntu and Windows and I saw same thing. What should I do after take data?

            QByteArray DataReceiver::getData(int port)
            {
                QString url = QString("http://localhost:%1/sample").arg(port);
                _apiUrl.setUrl(url);
                _request.setUrl(_apiUrl);
                reply = _manager.get(_request);
                connect(reply, &QNetworkReply::finished, &_loop, &QEventLoop::quit);
                _loop.exec();
                if (reply->error() == QNetworkReply::NoError) {
                    QByteArray responseData = reply->readAll();
                    reply->deleteLater();
                    return  responseData;
                } else {
                    QString _error = tr("Error");
                    QString _spectrum_error = tr("Spectrum error.");
                    QMessageBox::critical(nullptr, _error, _spectrum_error);
                    stop();
                }
                reply->deleteLater();
                return {};
            }
            

            if I use my code like that :

            QByteArray DataReceiver::getData(int port)
            {
                QString url = QString("http://localhost:%1/sample").arg(port);
                QUrl _apiUrl(url);
                QNetworkRequest _request(_apiUrl);
                QEventLoop _loop;
                QNetworkAccessManager _manager;
                QNetworkReply *reply = _manager.get(_request);
                connect(reply, &QNetworkReply::finished, &_loop, &QEventLoop::quit);
                _loop.exec();
                if (reply->error() == QNetworkReply::NoError) {
                    QByteArray responseData = reply->readAll();
                    reply->deleteLater();
                    return  responseData;
                } else {
                    QString _error = tr("Error");
                    QString _spectrum_error = tr("Spectrum error.");
                    QMessageBox::critical(nullptr, _error, _spectrum_error);
                    stop();
                }
                reply->deleteLater();
                return {};
            }
            

            Memory will not rise but response time slow....

            JonBJ 1 Reply Last reply
            0
            • J Joe von Habsburg

              @Volker75 said in Qt6 Windows slower than Qt6 Ubuntu:

              And what was the reason? Windows defender?

              another networkmanager.....

              @Christian-Ehrlicher , @JonB , @jsulm

              Hi guys, I need your help. When I run the my program (only data receive) after 30min, my ram will be 20gb. It's increase always. I tested it in Ubuntu and Windows and I saw same thing. What should I do after take data?

              QByteArray DataReceiver::getData(int port)
              {
                  QString url = QString("http://localhost:%1/sample").arg(port);
                  _apiUrl.setUrl(url);
                  _request.setUrl(_apiUrl);
                  reply = _manager.get(_request);
                  connect(reply, &QNetworkReply::finished, &_loop, &QEventLoop::quit);
                  _loop.exec();
                  if (reply->error() == QNetworkReply::NoError) {
                      QByteArray responseData = reply->readAll();
                      reply->deleteLater();
                      return  responseData;
                  } else {
                      QString _error = tr("Error");
                      QString _spectrum_error = tr("Spectrum error.");
                      QMessageBox::critical(nullptr, _error, _spectrum_error);
                      stop();
                  }
                  reply->deleteLater();
                  return {};
              }
              

              if I use my code like that :

              QByteArray DataReceiver::getData(int port)
              {
                  QString url = QString("http://localhost:%1/sample").arg(port);
                  QUrl _apiUrl(url);
                  QNetworkRequest _request(_apiUrl);
                  QEventLoop _loop;
                  QNetworkAccessManager _manager;
                  QNetworkReply *reply = _manager.get(_request);
                  connect(reply, &QNetworkReply::finished, &_loop, &QEventLoop::quit);
                  _loop.exec();
                  if (reply->error() == QNetworkReply::NoError) {
                      QByteArray responseData = reply->readAll();
                      reply->deleteLater();
                      return  responseData;
                  } else {
                      QString _error = tr("Error");
                      QString _spectrum_error = tr("Spectrum error.");
                      QMessageBox::critical(nullptr, _error, _spectrum_error);
                      stop();
                  }
                  reply->deleteLater();
                  return {};
              }
              

              Memory will not rise but response time slow....

              JonBJ Offline
              JonBJ Offline
              JonB
              wrote on last edited by
              #22

              @Joe-von-Habsburg
              Is the difference due to the QNetworkAccessManager _manager; or to the QNetworkReply *reply = _manager.get(_request);?
              In the bad case you might connect to reply->destroyed() to make sure it is indeed getting freed.

              J 1 Reply Last reply
              0
              • JonBJ JonB

                @Joe-von-Habsburg
                Is the difference due to the QNetworkAccessManager _manager; or to the QNetworkReply *reply = _manager.get(_request);?
                In the bad case you might connect to reply->destroyed() to make sure it is indeed getting freed.

                J Offline
                J Offline
                Joe von Habsburg
                wrote on last edited by Joe von Habsburg
                #23

                @JonB

                According to my tests, if I rebuild the NetworkManager, my memory usage does not increase. But this time my receiving time is slowing down.

                If I do not recreate the NetworkManager, my reception time decreases but memory usage increases.

                connect(reply, &QNetworkReply::destroyed, this, &DataReceiver::replyDeleted);
                

                it's work, reply deleted

                JonBJ J 2 Replies Last reply
                0
                • J Joe von Habsburg

                  @JonB

                  According to my tests, if I rebuild the NetworkManager, my memory usage does not increase. But this time my receiving time is slowing down.

                  If I do not recreate the NetworkManager, my reception time decreases but memory usage increases.

                  connect(reply, &QNetworkReply::destroyed, this, &DataReceiver::replyDeleted);
                  

                  it's work, reply deleted

                  JonBJ Offline
                  JonBJ Offline
                  JonB
                  wrote on last edited by
                  #24

                  @Joe-von-Habsburg
                  In that case please replace the second one's QNetworkReply *reply = _manager.get(_request); with the first one's reply = _manager.get(_request); (I assume reply is a member variable, this->reply) and confirm. Then the only difference is the local QNetworkAccessManager _manager versus a class member one.

                  1 Reply Last reply
                  0
                  • J Joe von Habsburg

                    @JonB

                    According to my tests, if I rebuild the NetworkManager, my memory usage does not increase. But this time my receiving time is slowing down.

                    If I do not recreate the NetworkManager, my reception time decreases but memory usage increases.

                    connect(reply, &QNetworkReply::destroyed, this, &DataReceiver::replyDeleted);
                    

                    it's work, reply deleted

                    J Offline
                    J Offline
                    Joe von Habsburg
                    wrote on last edited by Joe von Habsburg
                    #25

                    @Joe-von-Habsburg said in Qt6 Windows slower than Qt6 Ubuntu:

                    connect(reply, &QNetworkReply::destroyed, this, &DataReceiver::replyDeleted);

                    sorry for that. this is work only when I stop my while loop. How can force it ?

                    @Joe-von-Habsburg said in Qt6 Windows slower than Qt6 Ubuntu:

                     void DataReceiver::start()
                     {
                         _connection++;
                         if(_connection > 1)
                             return;
                     
                         qDebug() << "Starting take data";
                         _takeData = true;
                         while(_takeData){
                             QDateTime time1 = QDateTime::currentDateTime();
                             _sample = getData(54664);
                             QDateTime time3 = QDateTime::currentDateTime();
                             if(_takeIQData)
                                 _iq = getData(54665);
                             QDateTime time2 = QDateTime::currentDateTime();
                             qDebug() << "sample : " << time3 - time1 << " iq : " << time2 - time3 << "time :  << time2 - time1;
                            emit sendData(_sample, _iq);
                         }
                         qDebug() << "Finished taking data";
                     }
                    
                    

                    @JonB said in Qt6 Windows slower than Qt6 Ubuntu:

                    n that case please replace the second one's QNetworkReply *reply = _manager.get(_request); with the first one's reply = _manager.get(_request); (I assume reply is a member variable, this->reply) and confirm. Then the only difference is the local QNetworkAccessManager _manager versus a class member one.

                    I change it.
                    _reply and _manager class member now

                    QByteArray DataReceiver::getData(int port)
                    {
                        QString url = QString("http://localhost:%1/sample").arg(port);
                        QUrl _apiUrl(url);
                        QNetworkRequest _request(_apiUrl);
                        QEventLoop _loop;
                        _reply = _manager.get(_request);
                        connect(_reply, &QNetworkReply::finished, &_loop, &QEventLoop::quit);
                        connect(_reply, &QNetworkReply::destroyed, this, &DataReceiver::replyDeleted);
                        _loop.exec();
                        if (_reply->error() == QNetworkReply::NoError) {
                            QByteArray responseData = _reply->readAll();
                            _reply->deleteLater();
                            return  responseData;
                        } else {
                            QString _error = tr("Error");
                            QString _spectrum_error = tr("Spectrum error.");
                            QMessageBox::critical(nullptr, _error, _spectrum_error);
                            stop();
                        }
                        _reply->deleteLater();
                        return {};
                    }
                    

                    The problem still exists.

                    I think lots of reply are created and they only delete I stop my loop.

                    JonBJ 1 Reply Last reply
                    0
                    • J Joe von Habsburg

                      @Joe-von-Habsburg said in Qt6 Windows slower than Qt6 Ubuntu:

                      connect(reply, &QNetworkReply::destroyed, this, &DataReceiver::replyDeleted);

                      sorry for that. this is work only when I stop my while loop. How can force it ?

                      @Joe-von-Habsburg said in Qt6 Windows slower than Qt6 Ubuntu:

                       void DataReceiver::start()
                       {
                           _connection++;
                           if(_connection > 1)
                               return;
                       
                           qDebug() << "Starting take data";
                           _takeData = true;
                           while(_takeData){
                               QDateTime time1 = QDateTime::currentDateTime();
                               _sample = getData(54664);
                               QDateTime time3 = QDateTime::currentDateTime();
                               if(_takeIQData)
                                   _iq = getData(54665);
                               QDateTime time2 = QDateTime::currentDateTime();
                               qDebug() << "sample : " << time3 - time1 << " iq : " << time2 - time3 << "time :  << time2 - time1;
                              emit sendData(_sample, _iq);
                           }
                           qDebug() << "Finished taking data";
                       }
                      
                      

                      @JonB said in Qt6 Windows slower than Qt6 Ubuntu:

                      n that case please replace the second one's QNetworkReply *reply = _manager.get(_request); with the first one's reply = _manager.get(_request); (I assume reply is a member variable, this->reply) and confirm. Then the only difference is the local QNetworkAccessManager _manager versus a class member one.

                      I change it.
                      _reply and _manager class member now

                      QByteArray DataReceiver::getData(int port)
                      {
                          QString url = QString("http://localhost:%1/sample").arg(port);
                          QUrl _apiUrl(url);
                          QNetworkRequest _request(_apiUrl);
                          QEventLoop _loop;
                          _reply = _manager.get(_request);
                          connect(_reply, &QNetworkReply::finished, &_loop, &QEventLoop::quit);
                          connect(_reply, &QNetworkReply::destroyed, this, &DataReceiver::replyDeleted);
                          _loop.exec();
                          if (_reply->error() == QNetworkReply::NoError) {
                              QByteArray responseData = _reply->readAll();
                              _reply->deleteLater();
                              return  responseData;
                          } else {
                              QString _error = tr("Error");
                              QString _spectrum_error = tr("Spectrum error.");
                              QMessageBox::critical(nullptr, _error, _spectrum_error);
                              stop();
                          }
                          _reply->deleteLater();
                          return {};
                      }
                      

                      The problem still exists.

                      I think lots of reply are created and they only delete I stop my loop.

                      JonBJ Offline
                      JonBJ Offline
                      JonB
                      wrote on last edited by
                      #26

                      @Joe-von-Habsburg said in Qt6 Windows slower than Qt6 Ubuntu:

                      I think lots of reply are created and they only delete I stop my loop.

                      I do not follow this. One reply per _manager.get(_request), and you have checked that is getting destroyed.

                      Supposedly, the only difference now is that in good case you create and destroy a local QNetworkAccessManager _manager each time (hence slower) while in bad case you reuse member variable. Right?

                      In that case can only suggest you try playing with stuff to see if it makes any difference in the bad case. QNAM has a couple of caches you can clear (see docs), try those. Try calling its setAutoDeleteReplies(true). Try making the member variable a QNetworkAccessManager *_manager which you new and deleteLater() or delete and instead create a new one in the member variable each time its destroyed for use next time. That would "emulate" having it as a local variable which gets automatically created & destroyed in the good case.

                      Other than that I am out of ideas. maybe someone expert will comment.

                      J 2 Replies Last reply
                      0
                      • JonBJ JonB

                        @Joe-von-Habsburg said in Qt6 Windows slower than Qt6 Ubuntu:

                        I think lots of reply are created and they only delete I stop my loop.

                        I do not follow this. One reply per _manager.get(_request), and you have checked that is getting destroyed.

                        Supposedly, the only difference now is that in good case you create and destroy a local QNetworkAccessManager _manager each time (hence slower) while in bad case you reuse member variable. Right?

                        In that case can only suggest you try playing with stuff to see if it makes any difference in the bad case. QNAM has a couple of caches you can clear (see docs), try those. Try calling its setAutoDeleteReplies(true). Try making the member variable a QNetworkAccessManager *_manager which you new and deleteLater() or delete and instead create a new one in the member variable each time its destroyed for use next time. That would "emulate" having it as a local variable which gets automatically created & destroyed in the good case.

                        Other than that I am out of ideas. maybe someone expert will comment.

                        J Offline
                        J Offline
                        Joe von Habsburg
                        wrote on last edited by
                        #27

                        @JonB said in Qt6 Windows slower than Qt6 Ubuntu:

                        One reply per _manager.get(_request), and you have checked that is getting destroyed.

                        I can't delete _reply after get data.

                        _reply->deleteLater();
                        

                        I used connect function, I saw this result: when I stop loop, _replys will be deleted (lots of delete).

                        connect(_reply, &QNetworkReply::destroyed, this, &DataReceiver::replyDeleted);
                        void DataReceiver::replyDeleted()
                        {
                            qDebug() << "reply deleted.";
                        }
                        

                        Result : 500409cc-80cf-486c-a0d2-cf80d7040a0a-image.png

                        @JonB said in Qt6 Windows slower than Qt6 Ubuntu:

                        Supposedly, the only difference now is that in good case you create and destroy a local QNetworkAccessManager _manager each time (hence slower) while in bad case you reuse member variable. Right?

                        Yes you right, if I do not use as local member (_manager), response time slow, but I use as local member, memory leak.

                        @JonB said in Qt6 Windows slower than Qt6 Ubuntu:

                        ry calling its setAutoDeleteReplies(true). Try making the member variable a QNetworkAccessManager *_manager which you new and deleteLater()

                        QByteArray DataReceiver::getData(int port)
                        {
                            QString url = QString("http://localhost:%1/sample").arg(port);
                            QUrl _apiUrl(url);
                            QNetworkRequest _request(_apiUrl);
                            QEventLoop _loop;
                            _manager = new QNetworkAccessManager();
                            _manager->setAutoDeleteReplies(true);
                            _reply = _manager->get(_request);
                            connect(_reply, &QNetworkReply::finished, &_loop, &QEventLoop::quit);
                            connect(_reply, &QNetworkReply::destroyed, this, &DataReceiver::replyDeleted);
                            _loop.exec();
                            if (_reply->error() == QNetworkReply::NoError) {
                                QByteArray responseData = _reply->readAll();
                                _reply->deleteLater();
                                _manager->deleteLater();
                                return  responseData;
                            } else {
                                QString _error = tr("Error");
                                QString _spectrum_error = tr("Spectrum error.");
                                QMessageBox::critical(nullptr, _error, _spectrum_error);
                                stop();
                            }
                            _reply->deleteLater();
                            return {};
                        }
                        

                        I added them my function, but now slow time and memory leak exist together.

                        @JonB said in Qt6 Windows slower than Qt6 Ubuntu:

                        Other than that I am out of ideas. maybe someone expert will comment.

                        Thank you, Anyone can help me, I will be honered.

                        1 Reply Last reply
                        0
                        • JonBJ JonB

                          @Joe-von-Habsburg said in Qt6 Windows slower than Qt6 Ubuntu:

                          I think lots of reply are created and they only delete I stop my loop.

                          I do not follow this. One reply per _manager.get(_request), and you have checked that is getting destroyed.

                          Supposedly, the only difference now is that in good case you create and destroy a local QNetworkAccessManager _manager each time (hence slower) while in bad case you reuse member variable. Right?

                          In that case can only suggest you try playing with stuff to see if it makes any difference in the bad case. QNAM has a couple of caches you can clear (see docs), try those. Try calling its setAutoDeleteReplies(true). Try making the member variable a QNetworkAccessManager *_manager which you new and deleteLater() or delete and instead create a new one in the member variable each time its destroyed for use next time. That would "emulate" having it as a local variable which gets automatically created & destroyed in the good case.

                          Other than that I am out of ideas. maybe someone expert will comment.

                          J Offline
                          J Offline
                          Joe von Habsburg
                          wrote on last edited by Joe von Habsburg
                          #28

                          @JonB said in Qt6 Windows slower than Qt6 Ubuntu:

                          setAutoDeleteReplies(true)

                          this is crashed my program when I do something.

                          if I do it :

                          _manager.setAutoDeleteReplies(true);
                          

                          memory and speed ok, but program crashed anytime , when I do anything. because reply deleted. why ?

                          JonBJ 1 Reply Last reply
                          0
                          • J Joe von Habsburg

                            @JonB said in Qt6 Windows slower than Qt6 Ubuntu:

                            setAutoDeleteReplies(true)

                            this is crashed my program when I do something.

                            if I do it :

                            _manager.setAutoDeleteReplies(true);
                            

                            memory and speed ok, but program crashed anytime , when I do anything. because reply deleted. why ?

                            JonBJ Offline
                            JonBJ Offline
                            JonB
                            wrote on last edited by
                            #29

                            @Joe-von-Habsburg
                            I would guess you need to not delete it yourself now (_reply->deleteLater()) since it is being auto-deleted on QNetworkReply::finished?

                            However if it is being auto-deleted on finished then, because you do _loop.exec(); which waits for finished I would guess you can no longer do _reply->readAll() after the loop, that sounds like crash. You could instead do your data reading inside the loop instead of afterwards.

                            I really don't know, and have never used any of this stuff :) It was suggestions for narrowing down where the "leakage" might be. But you need someone else if you need someone who truly knows about it.

                            J 1 Reply Last reply
                            0
                            • JonBJ JonB

                              @Joe-von-Habsburg
                              I would guess you need to not delete it yourself now (_reply->deleteLater()) since it is being auto-deleted on QNetworkReply::finished?

                              However if it is being auto-deleted on finished then, because you do _loop.exec(); which waits for finished I would guess you can no longer do _reply->readAll() after the loop, that sounds like crash. You could instead do your data reading inside the loop instead of afterwards.

                              I really don't know, and have never used any of this stuff :) It was suggestions for narrowing down where the "leakage" might be. But you need someone else if you need someone who truly knows about it.

                              J Offline
                              J Offline
                              Joe von Habsburg
                              wrote on last edited by
                              #30

                              @JonB said in Qt6 Windows slower than Qt6 Ubuntu:

                              You could instead do your data reading inside the loop instead of afterwards.

                              can you give me code example ?

                              @JonB said in Qt6 Windows slower than Qt6 Ubuntu:

                              But you need someone else if you need someone who truly knows about it.

                              Yes but who will be :D

                              JonBJ 1 Reply Last reply
                              0
                              • J Joe von Habsburg

                                @JonB said in Qt6 Windows slower than Qt6 Ubuntu:

                                You could instead do your data reading inside the loop instead of afterwards.

                                can you give me code example ?

                                @JonB said in Qt6 Windows slower than Qt6 Ubuntu:

                                But you need someone else if you need someone who truly knows about it.

                                Yes but who will be :D

                                JonBJ Offline
                                JonBJ Offline
                                JonB
                                wrote on last edited by
                                #31

                                @Joe-von-Habsburg said in Qt6 Windows slower than Qt6 Ubuntu:

                                can you give me code example ?

                                loop.exec() is just a convenience, which blocks till finished(), making your call "synchronous". Instead you can deal with all the data which arrives when it arrives (instead of after finished()) by attaching a slot to _reply->readyRead() signal.

                                Of course, if you remove _loop.exec() from getData() it will exit while network stuff is still going on, you must not have local variables which go out of scope. You will have to do quite a bit of code reorganizing. And it might be to no avail, I don't know what it will reveal or whether it will solve anything.

                                J 1 Reply Last reply
                                0
                                • JonBJ JonB

                                  @Joe-von-Habsburg said in Qt6 Windows slower than Qt6 Ubuntu:

                                  can you give me code example ?

                                  loop.exec() is just a convenience, which blocks till finished(), making your call "synchronous". Instead you can deal with all the data which arrives when it arrives (instead of after finished()) by attaching a slot to _reply->readyRead() signal.

                                  Of course, if you remove _loop.exec() from getData() it will exit while network stuff is still going on, you must not have local variables which go out of scope. You will have to do quite a bit of code reorganizing. And it might be to no avail, I don't know what it will reveal or whether it will solve anything.

                                  J Offline
                                  J Offline
                                  Joe von Habsburg
                                  wrote on last edited by Joe von Habsburg
                                  #32

                                  @JonB said in Qt6 Windows slower than Qt6 Ubuntu:

                                  loop.exec() is just a convenience, which blocks till finished(), making your call "synchronous". Instead you can deal with all the data which arrives when it arrives (instead of after finished()) by attaching a slot to _reply->readyRead() signal.

                                  I changed my code.

                                  void DataReceiver::start()
                                  {
                                      if(!_takeData)
                                          return;
                                  
                                      QDateTime time1 = QDateTime::currentDateTime();
                                      getDataSample(); //_sample = getData(54664);
                                      QDateTime time3 = QDateTime::currentDateTime();
                                      if(_takeIQData)
                                          getDataIQ(); //_iq = getData(54665);
                                      QDateTime time2 = QDateTime::currentDateTime();
                                      qDebug() << "sample : " << time3 - time1 << " iq : " << time2 - time3 << "time : " << time2 - time1;
                                  }
                                  
                                  void DataReceiver::getDataSample()
                                  {
                                      QString url = QString("http://localhost:%1/sample").arg(54664);
                                      QUrl _apiUrl(url);
                                      QNetworkRequest _request(_apiUrl);
                                      _replySample = _managerSample.get(_request);
                                      connect(_replySample, &QNetworkReply::readyRead, this, &DataReceiver::readSample);
                                  }
                                  
                                  void DataReceiver::getDataIQ()
                                  {
                                      QString url = QString("http://localhost:%1/sample").arg(54665);
                                      QUrl _apiUrl(url);
                                      QNetworkRequest _request(_apiUrl);
                                      _replyIQ = _managerIQ.get(_request);
                                      connect(_replyIQ, &QNetworkReply::readyRead, this, &DataReceiver::readIQ);
                                  }
                                  
                                  void DataReceiver::readSample()
                                  {
                                      _sample = _replySample->readAll();
                                      _replySample->deleteLater();
                                      if(!_takeIQData){
                                          emit sendData(_sample, _iq);
                                          _sample.clear();
                                          _iq.clear();
                                          start();
                                      }
                                  
                                  }
                                  
                                  void DataReceiver::readIQ()
                                  {
                                      _iq = _replyIQ->readAll();
                                      _replyIQ->deleteLater();
                                      if(_takeIQData){
                                          emit sendData(_sample, _iq);
                                          _sample.clear();
                                          _iq.clear();
                                          start();
                                      }
                                  }
                                  

                                  After a while crashing :(

                                  J 1 Reply Last reply
                                  0
                                  • J Joe von Habsburg

                                    @JonB said in Qt6 Windows slower than Qt6 Ubuntu:

                                    loop.exec() is just a convenience, which blocks till finished(), making your call "synchronous". Instead you can deal with all the data which arrives when it arrives (instead of after finished()) by attaching a slot to _reply->readyRead() signal.

                                    I changed my code.

                                    void DataReceiver::start()
                                    {
                                        if(!_takeData)
                                            return;
                                    
                                        QDateTime time1 = QDateTime::currentDateTime();
                                        getDataSample(); //_sample = getData(54664);
                                        QDateTime time3 = QDateTime::currentDateTime();
                                        if(_takeIQData)
                                            getDataIQ(); //_iq = getData(54665);
                                        QDateTime time2 = QDateTime::currentDateTime();
                                        qDebug() << "sample : " << time3 - time1 << " iq : " << time2 - time3 << "time : " << time2 - time1;
                                    }
                                    
                                    void DataReceiver::getDataSample()
                                    {
                                        QString url = QString("http://localhost:%1/sample").arg(54664);
                                        QUrl _apiUrl(url);
                                        QNetworkRequest _request(_apiUrl);
                                        _replySample = _managerSample.get(_request);
                                        connect(_replySample, &QNetworkReply::readyRead, this, &DataReceiver::readSample);
                                    }
                                    
                                    void DataReceiver::getDataIQ()
                                    {
                                        QString url = QString("http://localhost:%1/sample").arg(54665);
                                        QUrl _apiUrl(url);
                                        QNetworkRequest _request(_apiUrl);
                                        _replyIQ = _managerIQ.get(_request);
                                        connect(_replyIQ, &QNetworkReply::readyRead, this, &DataReceiver::readIQ);
                                    }
                                    
                                    void DataReceiver::readSample()
                                    {
                                        _sample = _replySample->readAll();
                                        _replySample->deleteLater();
                                        if(!_takeIQData){
                                            emit sendData(_sample, _iq);
                                            _sample.clear();
                                            _iq.clear();
                                            start();
                                        }
                                    
                                    }
                                    
                                    void DataReceiver::readIQ()
                                    {
                                        _iq = _replyIQ->readAll();
                                        _replyIQ->deleteLater();
                                        if(_takeIQData){
                                            emit sendData(_sample, _iq);
                                            _sample.clear();
                                            _iq.clear();
                                            start();
                                        }
                                    }
                                    

                                    After a while crashing :(

                                    J Offline
                                    J Offline
                                    Joe von Habsburg
                                    wrote on last edited by
                                    #33

                                    @Joe-von-Habsburg said in Qt6 Windows slower than Qt6 Ubuntu:

                                    After a while crashing :(

                                    I found the reason. Because readReady() sometimes receives incomplete data.

                                    jsulmJ JonBJ 2 Replies Last reply
                                    0
                                    • J Joe von Habsburg

                                      @Joe-von-Habsburg said in Qt6 Windows slower than Qt6 Ubuntu:

                                      After a while crashing :(

                                      I found the reason. Because readReady() sometimes receives incomplete data.

                                      jsulmJ Offline
                                      jsulmJ Offline
                                      jsulm
                                      Lifetime Qt Champion
                                      wrote on last edited by
                                      #34

                                      @Joe-von-Habsburg said in Qt6 Windows slower than Qt6 Ubuntu:

                                      sometimes receives incomplete data

                                      Yes, because there is no guarantee that you get all data in one piece. That's why you need to buffer incoming data until you received a whole package of data.

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

                                      Christian EhrlicherC J 2 Replies Last reply
                                      1
                                      • jsulmJ jsulm

                                        @Joe-von-Habsburg said in Qt6 Windows slower than Qt6 Ubuntu:

                                        sometimes receives incomplete data

                                        Yes, because there is no guarantee that you get all data in one piece. That's why you need to buffer incoming data until you received a whole package of data.

                                        Christian EhrlicherC Online
                                        Christian EhrlicherC Online
                                        Christian Ehrlicher
                                        Lifetime Qt Champion
                                        wrote on last edited by
                                        #35

                                        @jsulm... or use the requestFinished signal 🙂

                                        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
                                        • jsulmJ jsulm

                                          @Joe-von-Habsburg said in Qt6 Windows slower than Qt6 Ubuntu:

                                          sometimes receives incomplete data

                                          Yes, because there is no guarantee that you get all data in one piece. That's why you need to buffer incoming data until you received a whole package of data.

                                          J Offline
                                          J Offline
                                          Joe von Habsburg
                                          wrote on last edited by Joe von Habsburg
                                          #36

                                          @jsulm said in Qt6 Windows slower than Qt6 Ubuntu:

                                          Yes, because there is no guarantee that you get all data in one piece. That's why you need to buffer incoming data until you received a whole package of data.

                                          Yes, I try downloadProgress signal like that:

                                          void DataReceiver::downloadProgressSample(qint64 bytesReceived, qint64 bytesTotal)
                                          {
                                              if(bytesReceived == bytesTotal){
                                                  _isSampleOk = true;
                                                  _sampleLen = bytesReceived;
                                              }
                                              else{
                                                  _isSampleOk = false;
                                                  _sampleLen = 0;
                                              }
                                          }
                                          

                                          but so many times, my QByteArray's length and bytesReceived are not equal.... and my program slowing for that.

                                          @Christian-Ehrlicher said in Qt6 Windows slower than Qt6 Ubuntu:

                                          or use the requestFinished signal

                                          I could not see requestFinished signal on documentation. Do you mean say finished signal ?

                                          jsulmJ JonBJ 2 Replies 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