ich nutze in meinem Programm einen QFileSystemWatcher, um die Größe einer Datei zu beobachten. Diese Datei wird bei der Ausführung des Programms geschrieben, und kann beliebig groß sein.
Um das ganze optisch darzustellen hab ich eine QProgressBar platziert, deren Value im Slot ::onFileChanged(const QString& file) mit QFileInfo::size() gesetzt wird.
Nun hab ich damit 2 Probleme. Zum einen wird die QProgressBar nicht aktualisiert, wenn sich die Größe der Datei ändert. Zum Debuggen habe ich dann mal eine QMessageBox eingebaut, die mir bei ::onFileChanged() die fileInfo->size() ausgibt. Während der Ausführung bekomm ich dann ein paar Popups, mit jeweils der korrekten aktuellen Größe der Datei, und siehe da: die ProgressBar wächst! Nehm ich die QMessageBox wieder raus, ändert sich die ProgressBar nicht - sie bleibt auf 0% stehn (unabhängig von der Datei, und ist auch reproduzierbar). Habe dann statt der QMessageBox (welche bei ner 2GB Datei bisschen nervig wegzuklicken is..) mal ein repaint() (aufs QMainWindow) oder ein progressBar->repaint() versucht, bringt nichts, bleibt stur auf 0% stehn.
Das andere Problem ist der QFileSystemWatcher selbst. Bei einer 35MB Datei bekomm ich 2x ::onFileChanged(), das ist zu wenig um eine flüssige Fortschrittsanzeige darzustellen.
Die Datei wird in einem eigenen Thread geschrieben. Dabei wird eine Inputdatei gelesen, gepuffert, und dann in die Ausgabedatei geschrieben. Etwa so:
Code: Alles auswählen
std::ifstream in(inputFileName, std::ios_base::binary);
std::ofstream out(outputFileName);
while (in.good())
{
in.read((char*)buffer.begin(), buffer.size());
if (in.eof())
// fertig
// buffer verarbeiten
out.write((const char*)buffer.begin(), size);
out.flush();
}
Kann man irgendwie erreichen, dass der Watcher schneller/öfter reagiert? Falls nicht, hat jemand eine andere Idee wie ich eine Fortschrittsanzeige realisieren könnte? Habe beim Verarbeiten der Datei im Thread leider zZ keine Möglichkeit den Status an den Mainthread zu melden.