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. problem processing standardoutput
QtWS25 Last Chance

problem processing standardoutput

Scheduled Pinned Locked Moved Solved General and Desktop
17 Posts 2 Posters 649 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
    Dijkstra
    wrote on last edited by Dijkstra
    #1

    when running my app from terminal i face a problem where the stop function runs before the gpuProcessStandardOutput where i store data and calulcate their average in the stop function any help
    the output looks like this
    average gpu utilization : -0
    average memory used : -0
    starting GPU monitor
    gpuProcessStarted
    gpuProcessStandardOutput
    gpu utilization : 25
    memory used : 591
    gpu utilization : 26
    memory used : 591
    gpu utilization : 24
    memory used : 591
    gpu utilization : 24
    memory used : 591
    gpu utilization : 26
    memory used : 591
    gpu utilization : 23
    memory used : 591
    gpu utilization : 24
    memory used : 591
    gpu utilization : 25
    memory used : 591
    gpu utilization : 25
    memory used : 591
    gpu utilization : 23
    memory used : 591
    gpuProcessFinished
    the average should be computed after data is stored not before them

    the start function code
    code_text

    QStringList params;
        if(offline)
            g.offline=true;
        params << "--query-gpu=timestamp,utilization.gpu,memory.used --format=csv ";
        //params << "/home/dijkstra/Downloads/devTools/testing/CPU.py";
        //cpuMonitorProcess.start("python3", params);
        //gpuMonitorProcess.start("nvidia-smi" ,params);
        gpuMonitorProcess.start("nvidia-smi --query-gpu=utilization.gpu,memory.used --format=csv -l 1");
        QObject::connect(&gpuMonitorProcess , SIGNAL(readyReadStandardOutput()), this, SLOT(gpuProcessStandardOutput()));
        QObject::connect(&gpuMonitorProcess , SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(gpuProcessFinished(int, QProcess::ExitStatus)));
        QObject::connect(&gpuMonitorProcess , SIGNAL(started()), this, SLOT(gpuProcessStarted()))
    

    main

    QString inputFileNameJSON = argv[1]; //;
            ApplicationEngine myApplicationEngine;
            //myApplicationEngine.checkAndStartServers();
            myApplicationEngine.initPluginOutputListner(inputFileNameJSON);
            /*while(!myApplicationEngine.isProcessCompleted())
            {
                QThread::msleep(100);
    
            }*/
            myApplicationEngine.parseAccuracyCalculationParams(inputFileNameJSON);
            myApplicationEngine.ComputeAccuracy();
            CPU_monitor cpu;
            cpu.startCPU(true);
            myApplicationEngine.startGPUMonitor(true);
            for(int i=0;i<100;i++){
                QThread::msleep(100);
            }
            myApplicationEngine.stopGPUMonitor(true);
            cpu.stopCPU(true);
    
    jsulmJ 2 Replies Last reply
    0
    • D Dijkstra

      when running my app from terminal i face a problem where the stop function runs before the gpuProcessStandardOutput where i store data and calulcate their average in the stop function any help
      the output looks like this
      average gpu utilization : -0
      average memory used : -0
      starting GPU monitor
      gpuProcessStarted
      gpuProcessStandardOutput
      gpu utilization : 25
      memory used : 591
      gpu utilization : 26
      memory used : 591
      gpu utilization : 24
      memory used : 591
      gpu utilization : 24
      memory used : 591
      gpu utilization : 26
      memory used : 591
      gpu utilization : 23
      memory used : 591
      gpu utilization : 24
      memory used : 591
      gpu utilization : 25
      memory used : 591
      gpu utilization : 25
      memory used : 591
      gpu utilization : 23
      memory used : 591
      gpuProcessFinished
      the average should be computed after data is stored not before them

      the start function code
      code_text

      QStringList params;
          if(offline)
              g.offline=true;
          params << "--query-gpu=timestamp,utilization.gpu,memory.used --format=csv ";
          //params << "/home/dijkstra/Downloads/devTools/testing/CPU.py";
          //cpuMonitorProcess.start("python3", params);
          //gpuMonitorProcess.start("nvidia-smi" ,params);
          gpuMonitorProcess.start("nvidia-smi --query-gpu=utilization.gpu,memory.used --format=csv -l 1");
          QObject::connect(&gpuMonitorProcess , SIGNAL(readyReadStandardOutput()), this, SLOT(gpuProcessStandardOutput()));
          QObject::connect(&gpuMonitorProcess , SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(gpuProcessFinished(int, QProcess::ExitStatus)));
          QObject::connect(&gpuMonitorProcess , SIGNAL(started()), this, SLOT(gpuProcessStarted()))
      

      main

      QString inputFileNameJSON = argv[1]; //;
              ApplicationEngine myApplicationEngine;
              //myApplicationEngine.checkAndStartServers();
              myApplicationEngine.initPluginOutputListner(inputFileNameJSON);
              /*while(!myApplicationEngine.isProcessCompleted())
              {
                  QThread::msleep(100);
      
              }*/
              myApplicationEngine.parseAccuracyCalculationParams(inputFileNameJSON);
              myApplicationEngine.ComputeAccuracy();
              CPU_monitor cpu;
              cpu.startCPU(true);
              myApplicationEngine.startGPUMonitor(true);
              for(int i=0;i<100;i++){
                  QThread::msleep(100);
              }
              myApplicationEngine.stopGPUMonitor(true);
              cpu.stopCPU(true);
      
      jsulmJ Offline
      jsulmJ Offline
      jsulm
      Lifetime Qt Champion
      wrote on last edited by
      #2

      @Dijkstra Please explain better! What stop function?
      Where in your app do you start Qt event loop?

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

      D 1 Reply Last reply
      1
      • jsulmJ jsulm

        @Dijkstra Please explain better! What stop function?
        Where in your app do you start Qt event loop?

        D Offline
        D Offline
        Dijkstra
        wrote on last edited by
        #3

        @jsulm

        void ApplicationEngine::stopGPUMonitor(bool offline)
        {
            std::cout << "stopping GPU monitor" << std::endl;
            int sum_gpu=0,memory_sum=0;
            for(int i=0;i<g.gpu_utilization_values.size();i++){
                sum_gpu+=g.gpu_utilization_values[i];
                //cout<<g.gpu_utilization_values[i]<<endl;
            }
            for(int i=1;i<g.gpu_utilization_memory_values.size();i++){
                memory_sum+=g.gpu_utilization_memory_values[i];
            }
            int size=g.gpu_utilization_values.size(),memory_size=g.gpu_utilization_memory_values.size();
            memory_size--;
            size--;
            if(!offline){
                emit(sendgpuupdates(QString("%1").arg((float)sum_gpu/size),"average gpu utilization: ",QString("%1").arg((float)memory_sum/memory_size),"average memory usage"));
            }
            g.gpu_utilization_values.clear();
            g.gpu_utilization_memory_values.clear();
            cout<<"average gpu utilization : "<<(float)sum_gpu/size<<endl;
            cout<<"average memory used : " <<(float)memory_sum/memory_size<<endl;
        
            std::cout << "starting GPU monitor" << std::endl;
                 //   cpuMonitorProcess.kill();
            gpuMonitorProcess.terminate();
            gpuMonitorProcess.waitForFinished(-1);
        }
        

        this is the stop function where i calculate the average on the data i get from this function

        void ApplicationEngine::gpuProcessStandardOutput()
        {
        
            std::cout << "gpuProcessStandardOutput" << std::endl;
        
            QTextStream rsyncStdoutStream(gpuMonitorProcess.readAllStandardOutput());
            while (true)
              {
                  QString line = rsyncStdoutStream.readLine();
                  if (line.isNull()) {
                      g.finished=true;
                      break;
                  } else
                  {
        
                  QString utilization="",memory_used="";
                   //stream << line<<'\n'; //print to file
                   for(int i=0;i<line.length();i++){
                     if(line[i]!=' ')
                         utilization+=line[i];
                     else{
                         while(line[i]!='M'){
                             if(line[i].isDigit())
                                 memory_used+=line[i];
                             i++;
                         }
                         break;
                     }
                   }
                   //cout<<memory_used.toStdString()<<endl;
        
                   g.gpu_utilization_memory_values.push_back(memory_used.toInt());
                   g.gpu_utilization_values.push_back(utilization.toInt());
                   if(!g.offline){
                       emit(sendgpuupdates(QString("%1").arg(line),"gpu utilization: ",QString("%1").arg(memory_used),"memory used"));
                   }
                   //std::cout<<line.toStdString()<<'\n';
                   if(utilization.length()!=15)
                    std::cout<<"gpu utilization : "<<utilization.toStdString()<<std::endl;
                   if(memory_used.length())
                    std::cout<<"memory used : "<<memory_used.toStdString()<<std::endl;
                  }
              }
        }
        
        1 Reply Last reply
        0
        • D Dijkstra

          when running my app from terminal i face a problem where the stop function runs before the gpuProcessStandardOutput where i store data and calulcate their average in the stop function any help
          the output looks like this
          average gpu utilization : -0
          average memory used : -0
          starting GPU monitor
          gpuProcessStarted
          gpuProcessStandardOutput
          gpu utilization : 25
          memory used : 591
          gpu utilization : 26
          memory used : 591
          gpu utilization : 24
          memory used : 591
          gpu utilization : 24
          memory used : 591
          gpu utilization : 26
          memory used : 591
          gpu utilization : 23
          memory used : 591
          gpu utilization : 24
          memory used : 591
          gpu utilization : 25
          memory used : 591
          gpu utilization : 25
          memory used : 591
          gpu utilization : 23
          memory used : 591
          gpuProcessFinished
          the average should be computed after data is stored not before them

          the start function code
          code_text

          QStringList params;
              if(offline)
                  g.offline=true;
              params << "--query-gpu=timestamp,utilization.gpu,memory.used --format=csv ";
              //params << "/home/dijkstra/Downloads/devTools/testing/CPU.py";
              //cpuMonitorProcess.start("python3", params);
              //gpuMonitorProcess.start("nvidia-smi" ,params);
              gpuMonitorProcess.start("nvidia-smi --query-gpu=utilization.gpu,memory.used --format=csv -l 1");
              QObject::connect(&gpuMonitorProcess , SIGNAL(readyReadStandardOutput()), this, SLOT(gpuProcessStandardOutput()));
              QObject::connect(&gpuMonitorProcess , SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(gpuProcessFinished(int, QProcess::ExitStatus)));
              QObject::connect(&gpuMonitorProcess , SIGNAL(started()), this, SLOT(gpuProcessStarted()))
          

          main

          QString inputFileNameJSON = argv[1]; //;
                  ApplicationEngine myApplicationEngine;
                  //myApplicationEngine.checkAndStartServers();
                  myApplicationEngine.initPluginOutputListner(inputFileNameJSON);
                  /*while(!myApplicationEngine.isProcessCompleted())
                  {
                      QThread::msleep(100);
          
                  }*/
                  myApplicationEngine.parseAccuracyCalculationParams(inputFileNameJSON);
                  myApplicationEngine.ComputeAccuracy();
                  CPU_monitor cpu;
                  cpu.startCPU(true);
                  myApplicationEngine.startGPUMonitor(true);
                  for(int i=0;i<100;i++){
                      QThread::msleep(100);
                  }
                  myApplicationEngine.stopGPUMonitor(true);
                  cpu.stopCPU(true);
          
          jsulmJ Offline
          jsulmJ Offline
          jsulm
          Lifetime Qt Champion
          wrote on last edited by
          #4

          @Dijkstra said in problem processing standardoutput:

          for(int i=0;i<100;i++){
          QThread::msleep(100);
          }

          Please do not do such things in event driven frameworks like Qt!
          This is not going to work!
          Use a QTimer to call stopGPUMonitor...

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

          D 1 Reply Last reply
          3
          • jsulmJ jsulm

            @Dijkstra said in problem processing standardoutput:

            for(int i=0;i<100;i++){
            QThread::msleep(100);
            }

            Please do not do such things in event driven frameworks like Qt!
            This is not going to work!
            Use a QTimer to call stopGPUMonitor...

            D Offline
            D Offline
            Dijkstra
            wrote on last edited by
            #5

            @jsulm so i am new can you give me a hint on how to change it to use qtimer ?

            jsulmJ 1 Reply Last reply
            0
            • D Dijkstra

              @jsulm so i am new can you give me a hint on how to change it to use qtimer ?

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

              @Dijkstra I suggest you first learn Qt basics. Also the documentation has examples how to use QTimer: https://doc.qt.io/qt-5/qtimer.html
              Here how to use QTimer:

              #cpu.startCPU(true);
              myApplicationEngine.startGPUMonitor(true);
              QTimer::singleShot(10000, [&myApplicationEngine](){ myApplicationEngine.stopGPUMonitor(true); });
              

              And I repeat my question: where in your code do you start Qt event loop?

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

              D 1 Reply Last reply
              1
              • jsulmJ jsulm

                @Dijkstra I suggest you first learn Qt basics. Also the documentation has examples how to use QTimer: https://doc.qt.io/qt-5/qtimer.html
                Here how to use QTimer:

                #cpu.startCPU(true);
                myApplicationEngine.startGPUMonitor(true);
                QTimer::singleShot(10000, [&myApplicationEngine](){ myApplicationEngine.stopGPUMonitor(true); });
                

                And I repeat my question: where in your code do you start Qt event loop?

                D Offline
                D Offline
                Dijkstra
                wrote on last edited by Dijkstra
                #7

                @jsulm
                starting GPU monitor done
                QObject::startTimer: Timers can only be used with threads started with QThread
                bye bye now
                QProcess: Destroyed while process ("nvidia-smi") is still running.
                gpuProcessStarted
                gpuProcessFinished

                this is the output its stops without printing any data
                and i dont have a qt event loop
                if u mean the start function this is it
                gpuMonitorProcess.start("nvidia-smi --query-gpu=utilization.gpu,memory.used --format=csv -l 1");
                its in the first code i added in the post

                jsulmJ 1 Reply Last reply
                0
                • D Dijkstra

                  @jsulm
                  starting GPU monitor done
                  QObject::startTimer: Timers can only be used with threads started with QThread
                  bye bye now
                  QProcess: Destroyed while process ("nvidia-smi") is still running.
                  gpuProcessStarted
                  gpuProcessFinished

                  this is the output its stops without printing any data
                  and i dont have a qt event loop
                  if u mean the start function this is it
                  gpuMonitorProcess.start("nvidia-smi --query-gpu=utilization.gpu,memory.used --format=csv -l 1");
                  its in the first code i added in the post

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

                  @Dijkstra said in problem processing standardoutput:

                  and i dont have a qt event loop

                  Then how is this going to work? You need running Qt event loop if you want to use signals/slots.

                  "QObject::startTimer: Timers can only be used with threads started with QThread" - do you use multi threading?
                  And please show your current code with QTimer...

                  "if u mean the start function this is it" - no, that is not what I mean. What I mean belongs to absolute Qt basics:

                  int main(int argc, char* argv[])
                  {
                      QScopedPointer<QCoreApplication> app(createApplication(argc, argv));
                  
                      if (qobject_cast<QApplication *>(app.data())) {
                         // start GUI version...
                      } else {
                         // start non-GUI version...
                      }
                  
                      return app->exec(); // This starts Qt event loop
                  }
                  

                  https://doc.qt.io/qt-5/qapplication.html

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

                  D 1 Reply Last reply
                  3
                  • jsulmJ jsulm

                    @Dijkstra said in problem processing standardoutput:

                    and i dont have a qt event loop

                    Then how is this going to work? You need running Qt event loop if you want to use signals/slots.

                    "QObject::startTimer: Timers can only be used with threads started with QThread" - do you use multi threading?
                    And please show your current code with QTimer...

                    "if u mean the start function this is it" - no, that is not what I mean. What I mean belongs to absolute Qt basics:

                    int main(int argc, char* argv[])
                    {
                        QScopedPointer<QCoreApplication> app(createApplication(argc, argv));
                    
                        if (qobject_cast<QApplication *>(app.data())) {
                           // start GUI version...
                        } else {
                           // start non-GUI version...
                        }
                    
                        return app->exec(); // This starts Qt event loop
                    }
                    

                    https://doc.qt.io/qt-5/qapplication.html

                    D Offline
                    D Offline
                    Dijkstra
                    wrote on last edited by Dijkstra
                    #9

                    @jsulm

                    if(argc <=1)
                        {
                            QApplication a(argc, argv);
                            MainWindow w;
                            w.show();
                            return a.exec();
                        }
                        else
                        {
                            QString inputFileNameJSON = argv[1]; //;
                            ApplicationEngine myApplicationEngine;
                            //myApplicationEngine.checkAndStartServers();
                            myApplicationEngine.initPluginOutputListner(inputFileNameJSON);
                            /*while(!myApplicationEngine.isProcessCompleted())
                            {
                                QThread::msleep(100);
                    
                            }*/
                            myApplicationEngine.parseAccuracyCalculationParams(inputFileNameJSON);
                            myApplicationEngine.ComputeAccuracy();
                            CPU_monitor cpu;
                            //cpu.startCPU(true);
                            myApplicationEngine.startGPUMonitor(true);
                            /*for(int i=0;i<100;i++){
                                QThread::msleep(100);
                            }*/
                            QTimer::singleShot(10000, [&myApplicationEngine](){ myApplicationEngine.stopGPUMonitor(true); });
                            //myApplicationEngine.stopGPUMonitor(true);
                            //cpu.stopCPU(true);
                    
                            std::cout << "bye bye now" << std::endl;
                    
                        }
                    

                    first condition starts the gui version and the other the non gui one and i am sorry for not knowing this basics w qt

                    jsulmJ 1 Reply Last reply
                    0
                    • D Dijkstra

                      @jsulm

                      if(argc <=1)
                          {
                              QApplication a(argc, argv);
                              MainWindow w;
                              w.show();
                              return a.exec();
                          }
                          else
                          {
                              QString inputFileNameJSON = argv[1]; //;
                              ApplicationEngine myApplicationEngine;
                              //myApplicationEngine.checkAndStartServers();
                              myApplicationEngine.initPluginOutputListner(inputFileNameJSON);
                              /*while(!myApplicationEngine.isProcessCompleted())
                              {
                                  QThread::msleep(100);
                      
                              }*/
                              myApplicationEngine.parseAccuracyCalculationParams(inputFileNameJSON);
                              myApplicationEngine.ComputeAccuracy();
                              CPU_monitor cpu;
                              //cpu.startCPU(true);
                              myApplicationEngine.startGPUMonitor(true);
                              /*for(int i=0;i<100;i++){
                                  QThread::msleep(100);
                              }*/
                              QTimer::singleShot(10000, [&myApplicationEngine](){ myApplicationEngine.stopGPUMonitor(true); });
                              //myApplicationEngine.stopGPUMonitor(true);
                              //cpu.stopCPU(true);
                      
                              std::cout << "bye bye now" << std::endl;
                      
                          }
                      

                      first condition starts the gui version and the other the non gui one and i am sorry for not knowing this basics w qt

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

                      @Dijkstra Simply start the event loop also in your second condition like you do in your first. Event loop is not a GUI thing - you can use it in console applications also (and you usually have to if you want to use, for example, signals/slots).

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

                      D 1 Reply Last reply
                      2
                      • jsulmJ jsulm

                        @Dijkstra Simply start the event loop also in your second condition like you do in your first. Event loop is not a GUI thing - you can use it in console applications also (and you usually have to if you want to use, for example, signals/slots).

                        D Offline
                        D Offline
                        Dijkstra
                        wrote on last edited by Dijkstra
                        #11

                        @jsulm man thanks so much you are amazing it worked is their a way to stop it after it finishing as it doesnt reach the cout<<"bye bye now at the end "<<endl; as i also want to run the cpu and stop it at the same time of stoping the gpu

                        jsulmJ 1 Reply Last reply
                        0
                        • D Dijkstra

                          @jsulm man thanks so much you are amazing it worked is their a way to stop it after it finishing as it doesnt reach the cout<<"bye bye now at the end "<<endl; as i also want to run the cpu and stop it at the same time of stoping the gpu

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

                          @Dijkstra said in problem processing standardoutput:

                          is their a way to stop it after it finishing

                          QTimer::singleShot(10000, [&myApplicationEngine](){ myApplicationEngine.stopGPUMonitor(true); qApp->exit() });
                          

                          https://doc.qt.io/qt-5/qcoreapplication.html#exit

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

                          D 1 Reply Last reply
                          1
                          • jsulmJ jsulm

                            @Dijkstra said in problem processing standardoutput:

                            is their a way to stop it after it finishing

                            QTimer::singleShot(10000, [&myApplicationEngine](){ myApplicationEngine.stopGPUMonitor(true); qApp->exit() });
                            

                            https://doc.qt.io/qt-5/qcoreapplication.html#exit

                            D Offline
                            D Offline
                            Dijkstra
                            wrote on last edited by
                            #13

                            @jsulm sorry one last question this is what i did and it works just fine it just doesnt exit the process and keeps hanging in the terminal

                            QTimer::singleShot(10000, [&myApplicationEngine,&cpu](){
                                        myApplicationEngine.stopGPUMonitor(true);
                                        cpu.stopCPU(true);qApp->exit();
                                        std::cout << "bye bye now" << std::endl;
                                        qApp->exit(0);
                                    });
                            
                            jsulmJ 1 Reply Last reply
                            0
                            • D Dijkstra

                              @jsulm sorry one last question this is what i did and it works just fine it just doesnt exit the process and keeps hanging in the terminal

                              QTimer::singleShot(10000, [&myApplicationEngine,&cpu](){
                                          myApplicationEngine.stopGPUMonitor(true);
                                          cpu.stopCPU(true);qApp->exit();
                                          std::cout << "bye bye now" << std::endl;
                                          qApp->exit(0);
                                      });
                              
                              jsulmJ Offline
                              jsulmJ Offline
                              jsulm
                              Lifetime Qt Champion
                              wrote on last edited by
                              #14

                              @Dijkstra Do you have any other loops somewhere?
                              Is it asking you to press a button to terminate?

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

                              D 1 Reply Last reply
                              0
                              • jsulmJ jsulm

                                @Dijkstra Do you have any other loops somewhere?
                                Is it asking you to press a button to terminate?

                                D Offline
                                D Offline
                                Dijkstra
                                wrote on last edited by
                                #15

                                @jsulm
                                it doesnt ask for a button to terminate but there is a loop in the function that processes standard output

                                void ApplicationEngine::gpuProcessStandardOutput()
                                {
                                
                                    //std::cout << "gpuProcessStandardOutput" << std::endl;
                                
                                    QTextStream rsyncStdoutStream(gpuMonitorProcess.readAllStandardOutput());
                                    while (true)
                                      {
                                          QString line = rsyncStdoutStream.readLine();
                                          if (line.isNull()) {
                                              g.finished=true;
                                              break;
                                          } else
                                          {
                                
                                          QString utilization="",memory_used="";
                                           //stream << line<<'\n'; //print to file
                                           for(int i=0;i<line.length();i++){
                                             if(line[i]!=' ')
                                                 utilization+=line[i];
                                             else{
                                                 while(line[i]!='M'){
                                                     if(line[i].isDigit())
                                                         memory_used+=line[i];
                                                     i++;
                                                 }
                                                 break;
                                             }
                                           }
                                           //cout<<memory_used.toStdString()<<endl;
                                
                                           g.gpu_utilization_memory_values.push_back(memory_used.toInt());
                                           g.gpu_utilization_values.push_back(utilization.toInt());
                                           if(!g.offline){
                                               emit(sendgpuupdates(QString("%1").arg(line),"gpu utilization: ",QString("%1").arg(memory_used),"memory used"));
                                           }
                                           //std::cout<<line.toStdString()<<'\n';
                                           if(utilization.length()!=15)
                                            std::cout<<"gpu utilization : "<<utilization.toStdString()<<std::endl;
                                           if(memory_used.length())
                                            std::cout<<"memory used : "<<memory_used.toStdString()<<std::endl;
                                          }
                                      }
                                }
                                
                                jsulmJ 1 Reply Last reply
                                0
                                • D Dijkstra

                                  @jsulm
                                  it doesnt ask for a button to terminate but there is a loop in the function that processes standard output

                                  void ApplicationEngine::gpuProcessStandardOutput()
                                  {
                                  
                                      //std::cout << "gpuProcessStandardOutput" << std::endl;
                                  
                                      QTextStream rsyncStdoutStream(gpuMonitorProcess.readAllStandardOutput());
                                      while (true)
                                        {
                                            QString line = rsyncStdoutStream.readLine();
                                            if (line.isNull()) {
                                                g.finished=true;
                                                break;
                                            } else
                                            {
                                  
                                            QString utilization="",memory_used="";
                                             //stream << line<<'\n'; //print to file
                                             for(int i=0;i<line.length();i++){
                                               if(line[i]!=' ')
                                                   utilization+=line[i];
                                               else{
                                                   while(line[i]!='M'){
                                                       if(line[i].isDigit())
                                                           memory_used+=line[i];
                                                       i++;
                                                   }
                                                   break;
                                               }
                                             }
                                             //cout<<memory_used.toStdString()<<endl;
                                  
                                             g.gpu_utilization_memory_values.push_back(memory_used.toInt());
                                             g.gpu_utilization_values.push_back(utilization.toInt());
                                             if(!g.offline){
                                                 emit(sendgpuupdates(QString("%1").arg(line),"gpu utilization: ",QString("%1").arg(memory_used),"memory used"));
                                             }
                                             //std::cout<<line.toStdString()<<'\n';
                                             if(utilization.length()!=15)
                                              std::cout<<"gpu utilization : "<<utilization.toStdString()<<std::endl;
                                             if(memory_used.length())
                                              std::cout<<"memory used : "<<memory_used.toStdString()<<std::endl;
                                            }
                                        }
                                  }
                                  
                                  jsulmJ Offline
                                  jsulmJ Offline
                                  jsulm
                                  Lifetime Qt Champion
                                  wrote on last edited by
                                  #16

                                  @Dijkstra said in problem processing standardoutput:

                                  but there is a loo

                                  Well, make sure you leave that loop

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

                                  D 1 Reply Last reply
                                  0
                                  • jsulmJ jsulm

                                    @Dijkstra said in problem processing standardoutput:

                                    but there is a loo

                                    Well, make sure you leave that loop

                                    D Offline
                                    D Offline
                                    Dijkstra
                                    wrote on last edited by
                                    #17

                                    @jsulm well i checked and all loops does stop but qApp->exit(0) doesnt stop the terminal and i have to press ctrl c to stop it even though their isnt any more output

                                    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