Wie QProcess synchronisieren ?

Alles rund um die Programmierung mit Qt
Antworten
Bronski
Beiträge: 44
Registriert: 10. Oktober 2008 13:46

Wie QProcess synchronisieren ?

Beitrag von Bronski »

Hallo,
ich habe folgendes Problem:

Die folgende Methode soll die Ausgabe des Shell Befehls smartctl -i zeilenweise in die QStringList info speichern:

Code: Alles auswählen

bool read_info()
{
QProcess smartctl_proc;
QByteArray info_output;
Tparser info_parser;

QString command = "smartctl -i ";
command.append(dev);

  #if defined(DEBUG_SMART)
  cout << "read_info erreicht\n";
  cout << "Command: "<< command.toLocal8Bit().constData() << "\n";
  #endif

  #if defined(DEBUG_SMART)
  if(access_able == true)
  {
  cout << "access_able = true\n";
  }
  else
  {
  cout <<  "access_able = false\n";
  }
  #endif

  if(access_able == true)
  {
   
   smartctl_proc.start(command);
   


  // if( smartctl_proc.waitForStarted() == false)
/*   while (smartctl_proc.state() !=  QProcess::Running) 
   { 

       if(smartctl_proc.state() == QProcess::NotRunning)
       {
       #if defined(DEBUG_SMART)
       cout << "Prozess "<< command.toLocal8Bit().constData()<< " nicht gestartet\n";
       cout << "Error:"<< smartctl_proc.error() << "\n";
       #endif
       return false;
       }
   }*/

     while(smartctl_proc.waitForReadyRead())
     {
     info_output = smartctl_proc.readAll();
     }
  

  #if defined(DEBUG_SMART)
  cout << "info_output Size: "<< info_output.size()<<"\n";
  #endif

  info_parser.set_heap(info_output);
 
  QStringList line_seperators;
  QStringList word_seperators;

  line_seperators.append("\n");

  info_parser.seperator_lines = line_seperators;
  info_parser.parse();



      #if defined(DEBUG_SMART)
      cout << " SMART_INFO     LINES\n";
      for(int x=0;x < info_parser.lines.count();++x)
      {
      cout << info_parser.lines.at(x).toLocal8Bit().constData() << "\n";


      }

      #endif



    if (info_parser.lines.empty() == false)
    {
    smartctl_proc.close();
    info = info_parser.lines;
    return true;
    }


  }

smartctl_proc.close();
return false;
}

Dieses funktioniert auch. Allerdings nur bei einem von etwa 5 Versuchen.

Es hat den Anschein:
1. Das der Befehl smartctl -i beendet wird, bevor seine Ergebnisse e in der Schleife mit waitForReadyRead() ausgelesen werden.

oder:
2. Das sich mein Programm beendet bevor die Ergebnisse gelesen werden. Was technisch allerdings nicht möglich sein dürfte - oder ?


Ich glaube fest an 1. , denn seit ich den Teil nach smartctl_proc.start() ausgeklammert habe (und mein Programm theoretisch schneller geworden ist) tritt das gewünschte Ergebnis häufiger auf.

Wie kann ich das synchronisieren ?
Gibt es noch andere Ursachen ?

Vielen Dank im Vorraus für eure Antworten.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Code: Alles auswählen

     while(smartctl_proc.waitForReadyRead())
     {
     info_output = smartctl_proc.readAll();
     }
Ich würde sagen da fehlt ein '+'
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Bronski
Beiträge: 44
Registriert: 10. Oktober 2008 13:46

Beitrag von Bronski »

Danke,
Es funktioniert jetzt einwandfrei.

Was ich nicht verstehe ist:
Ich habe das + auch an einer anderen Stelle mit dem df -T Befehl nicht gesetzt.Da funktioniert es immer . Weiß jemand woran das liegt ?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Dann ist df eben schneller und ist schon nach dem ersten waitForReadyRead() fertig / hat da schon alles zurückgegeben.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten