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
Qt 6.11 is out! See what's new in the release blog

problem processing standardoutput

Scheduled Pinned Locked Moved Solved General and Desktop
17 Posts 2 Posters 3.2k 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 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