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
Forum Updated to NodeBB v4.3 + New Features

problem processing standardoutput

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