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;
}
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.