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. read data continuously from QProcess
Forum Updated to NodeBB v4.3 + New Features

read data continuously from QProcess

Scheduled Pinned Locked Moved Unsolved General and Desktop
16 Posts 6 Posters 1.4k Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • S Offline
    S Offline
    SamiV123
    wrote on 30 Oct 2023, 09:22 last edited by SamiV123
    #6

    It might be that 7zip doesn't flush but uses carriage return (or even Win32 console API directly) to print the progress and without flushing (new line) the signal is not emitted.

    That being said you don't need the signal to read, you can always just try to read from the standard output (or the standard err) for example on a timer, i.e. polling.

    You might also check if there's some line buffering type of setting in QProcess.

    Also be aware of this caveat

    "Note: Windows intentionally suppresses output from GUI-only applications to inherited consoles. This does not apply to output redirected to files or pipes. To forward the output of GUI-only applications on the console nonetheless, you must use SeparateChannels and do the forwarding yourself by reading the output and writing it to the appropriate output channels."

    1 Reply Last reply
    0
    • J jgxy1123
      23 Oct 2023, 11:50

      I want to read the continuous data from QProcess.

      The problem is that I can not read continuously the compressing progress of 7z.exe, but can only get the final result after the process is finished. It seems that the signal of "readyReadStandardOutput" will be emitted only once when QProcess is finished.

      My code logic is below

      • make an instance of QProcess : QProcess proc
      • set readChannel : proc.setReadChannel(QProcess::StandardOutput)
      • connect signal and slots:
        . connect( &proc, &QProcess::readyReadStandardOutput,[&](){
        qDebug()<<QString::fromLocal8bit(proc.readAllStandardOutput());
        }
        .connect(&proc,&QProcess::finished,[&](){
        qDebug()<<"Process finished";
        }
      • set program start the Process:
        .proc.setProgram("cmd.exe")
        .proc.startCommand("7z.exe a myfolder.zip myfolder")
        .proc.waitForFinished(-1)
        .proc.close();
      J Offline
      J Offline
      JonB
      wrote on 30 Oct 2023, 12:15 last edited by
      #7

      @jgxy1123
      Having written earlier what you need to try to see whether you can get output from 7zip successfully.

      Just a heads up: rather than running an external command (you/end-users need 7z.exe installed, and code only works under Windows) you might consider doing the "zipping" directly in your Qt code. zlib is a library written in C that many people use. See also e.g. https://forum.qt.io/topic/74306/how-to-manage-zip-file.

      Though your example passes a directory/folder to zip, this can absolutely be done but does require a lot more work than just zipping one file/stream. See e.g. https://github.com/sebastiandev/zipper.

      May not apply to you (you may want simplicity of just running 7z.exe command) but here for others reading this.

      1 Reply Last reply
      2
      • M Offline
        M Offline
        mranger90
        wrote on 30 Oct 2023, 12:22 last edited by
        #8

        Here's how I parse the output of 7zip and send it to a progress bar object:

           // 7z a -bso0 -bsp1 <destination> <f1> <f2> <f3>
            auto cmd = m_7ZipCommand + "a -bso0 -bsp1 " + destFile + " " + Folder1+ " " +
                       Folder2 + " " +  Folder3;
        
        ...
          // connect the QProcess finished signal
            connect(&m_zipProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this,
                    &ProjectionExporter::onExportFinished);
        ...
           // Parse the output reported by 7Zip to report the progress percentage
            connect(&m_zipProcess, &QProcess::readyRead, this, [this]() {
                QString output = m_zipProcess.readAllStandardOutput();
                QRegularExpression percentageMessage("^(\\s*)(\\d+)(%.*)$");
                QRegularExpressionMatch match = percentageMessage.match(output);
                if (match.hasMatch())
                {
                    const int percentageExported = match.captured(2).toInt();
                    const float percentAsFloat = static_cast<float>(percentageExported) / 100.0f;
                    m_exportProgress.complatedFiles =
                        static_cast<int>(static_cast<float>(m_filesToBeExported) * percentAsFloat);
                    m_exportProgress.progressInPercentage = percentageExported;
                    emit exportProgress(m_exportProgress);
                }
            });
        
        J J 2 Replies Last reply 30 Oct 2023, 12:23
        0
        • M mranger90
          30 Oct 2023, 12:22

          Here's how I parse the output of 7zip and send it to a progress bar object:

             // 7z a -bso0 -bsp1 <destination> <f1> <f2> <f3>
              auto cmd = m_7ZipCommand + "a -bso0 -bsp1 " + destFile + " " + Folder1+ " " +
                         Folder2 + " " +  Folder3;
          
          ...
            // connect the QProcess finished signal
              connect(&m_zipProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this,
                      &ProjectionExporter::onExportFinished);
          ...
             // Parse the output reported by 7Zip to report the progress percentage
              connect(&m_zipProcess, &QProcess::readyRead, this, [this]() {
                  QString output = m_zipProcess.readAllStandardOutput();
                  QRegularExpression percentageMessage("^(\\s*)(\\d+)(%.*)$");
                  QRegularExpressionMatch match = percentageMessage.match(output);
                  if (match.hasMatch())
                  {
                      const int percentageExported = match.captured(2).toInt();
                      const float percentAsFloat = static_cast<float>(percentageExported) / 100.0f;
                      m_exportProgress.complatedFiles =
                          static_cast<int>(static_cast<float>(m_filesToBeExported) * percentAsFloat);
                      m_exportProgress.progressInPercentage = percentageExported;
                      emit exportProgress(m_exportProgress);
                  }
              });
          
          J Offline
          J Offline
          jsulm
          Lifetime Qt Champion
          wrote on 30 Oct 2023, 12:23 last edited by
          #9

          @mranger90 said in read data continuously from QProcess:

          connect(&m_zipProcess, &QProcess::readyRead, this, this {

          So, is the slot called?

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

          M 1 Reply Last reply 30 Oct 2023, 12:27
          1
          • M mranger90
            30 Oct 2023, 12:22

            Here's how I parse the output of 7zip and send it to a progress bar object:

               // 7z a -bso0 -bsp1 <destination> <f1> <f2> <f3>
                auto cmd = m_7ZipCommand + "a -bso0 -bsp1 " + destFile + " " + Folder1+ " " +
                           Folder2 + " " +  Folder3;
            
            ...
              // connect the QProcess finished signal
                connect(&m_zipProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this,
                        &ProjectionExporter::onExportFinished);
            ...
               // Parse the output reported by 7Zip to report the progress percentage
                connect(&m_zipProcess, &QProcess::readyRead, this, [this]() {
                    QString output = m_zipProcess.readAllStandardOutput();
                    QRegularExpression percentageMessage("^(\\s*)(\\d+)(%.*)$");
                    QRegularExpressionMatch match = percentageMessage.match(output);
                    if (match.hasMatch())
                    {
                        const int percentageExported = match.captured(2).toInt();
                        const float percentAsFloat = static_cast<float>(percentageExported) / 100.0f;
                        m_exportProgress.complatedFiles =
                            static_cast<int>(static_cast<float>(m_filesToBeExported) * percentAsFloat);
                        m_exportProgress.progressInPercentage = percentageExported;
                        emit exportProgress(m_exportProgress);
                    }
                });
            
            J Offline
            J Offline
            JonB
            wrote on 30 Oct 2023, 12:25 last edited by JonB
            #10

            @mranger90
            Looks much like you said originally. Does it get the output to parse? If not, have you acted on the suggestions to your issue?

            It would be "odd" to connect slot &QProcess::readyRead with code which only calls readAllStandardOutput().

            1 Reply Last reply
            0
            • J jsulm
              30 Oct 2023, 12:23

              @mranger90 said in read data continuously from QProcess:

              connect(&m_zipProcess, &QProcess::readyRead, this, this {

              So, is the slot called?

              M Offline
              M Offline
              mranger90
              wrote on 30 Oct 2023, 12:27 last edited by
              #11

              @jsulm
              Yes, this slot gets called regularly. It's how I update a progress bar for the operator.

              J J 2 Replies Last reply 30 Oct 2023, 12:28
              0
              • M mranger90
                30 Oct 2023, 12:27

                @jsulm
                Yes, this slot gets called regularly. It's how I update a progress bar for the operator.

                J Offline
                J Offline
                JonB
                wrote on 30 Oct 2023, 12:28 last edited by
                #12

                @mranger90
                So are you saying it is resolved and you get what you want, or do you still have any issue?

                M 1 Reply Last reply 30 Oct 2023, 12:28
                0
                • J JonB
                  30 Oct 2023, 12:28

                  @mranger90
                  So are you saying it is resolved and you get what you want, or do you still have any issue?

                  M Offline
                  M Offline
                  mranger90
                  wrote on 30 Oct 2023, 12:28 last edited by
                  #13

                  @JonB
                  I'm not the one with the issue. I posted some working code to help out.

                  J J 2 Replies Last reply 30 Oct 2023, 12:29
                  0
                  • M mranger90
                    30 Oct 2023, 12:27

                    @jsulm
                    Yes, this slot gets called regularly. It's how I update a progress bar for the operator.

                    J Offline
                    J Offline
                    jsulm
                    Lifetime Qt Champion
                    wrote on 30 Oct 2023, 12:29 last edited by
                    #14

                    @mranger90 If it is called did you check what "output" is? Maybe your regexp is wrong...

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

                    1 Reply Last reply
                    0
                    • M mranger90
                      30 Oct 2023, 12:28

                      @JonB
                      I'm not the one with the issue. I posted some working code to help out.

                      J Offline
                      J Offline
                      JonB
                      wrote on 30 Oct 2023, 12:29 last edited by
                      #15

                      @mranger90 LOL, I'm sorry :)

                      1 Reply Last reply
                      0
                      • M mranger90
                        30 Oct 2023, 12:28

                        @JonB
                        I'm not the one with the issue. I posted some working code to help out.

                        J Offline
                        J Offline
                        jsulm
                        Lifetime Qt Champion
                        wrote on 30 Oct 2023, 12:43 last edited by
                        #16

                        @mranger90 said in read data continuously from QProcess:

                        I'm not the one with the issue

                        Oh, I also did not realise :-D

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

                        1 Reply Last reply
                        1

                        15/16

                        30 Oct 2023, 12:29

                        • Login

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