Überprüfen, wann eine Datei vollständig vorhanden ist?

Alles rund um die Programmierung mit Qt
Antworten
don_js
Beiträge: 6
Registriert: 16. November 2010 11:03

Überprüfen, wann eine Datei vollständig vorhanden ist?

Beitrag von don_js »

Guten Morgen,

ich arbeite gerade in einer Client-Server-Umgebung, in der ich mit dem Client Daten vom Server abrufen kann. Die übertragene Datei muss am Client erst decodiert werden (was über ein externes Programm, das über einen Batch-Aufruf gestartet wird geschieht), dann soll sie direkt angezeigt werden.

Momentan habe ich da noch am Client eine Wartefunktion eingebaut, allerdings richtet die sich nicht nach der Dateigröße, sondern wartet einfach eine gewisse Zeit, bevor die Datei geöffnet wird. Die Wartezeit ist nötig, damit die Decodierung fertig ist, bevor die Datei geöffnet werden soll.
Die Zeit habe ich durch ausprobieren eingestellt.
Geht bei der jetzigen festen Bildgröße gut, aber wenn das Bild größer oder kleiner wär, würde es entweder gar nicht klappen, oder Zeit verschwenden.

Gibt es da einen sinnvolleren Weg?
Ich möchte quasi überprüfen, ob eine neue Datei vollständig erstellt wurde.
Oder überprüfen ob ein über die Kommandozeile gestartetes Programm fertigt ausgeführt wurde.

Erstellt wird eine Bitmap, nur als Zusatzinfo.

Wenn da jmd eine Idee/Denkanstoß hat, würde mir sehr helfen :)
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Starte den Batch-Prozess mit QProcess und warte auf das finished()-Signal.
don_js
Beiträge: 6
Registriert: 16. November 2010 11:03

Beitrag von don_js »

Klingt gut, werde ich ausprobieren!

Danke :)
don_js
Beiträge: 6
Registriert: 16. November 2010 11:03

Beitrag von don_js »

Ok, ich versteh die Anwendung noch nicht so ganz. Die Doku dazu habe ich mir gerade durchgelesen, ich bin aber nicht wirklich schlau geworden, was für Parameter ich finished() übergeben soll.

Code: Alles auswählen

void QProcess::finished ( int exitCode, QProcess::ExitStatus exitStatus ) 
Was soll ich da als exitCode und exitStatus angeben? Ich will ja nur, dass er wartet, bis das Programm fertig ausgeführt wurde.

Bei google habe ich nur die Anwendung in Slots gefunden, das sähe so aus, aber ich habe für die Funktion keine Signal-Slot-Kombo, sondern will nur die Funktion aufrufen.

Code: Alles auswählen

connect(qp, SIGNAL(finished(int)), this, SLOT(stopped()));
Probiert habe ich es jetzt gerade mit waitForFinished, was ich in der Doku gefunden habe.
Meine Decodierungsfunktion, die ein Kommandozeilenprogramm aufruft sieht jetzt so aus:

Code: Alles auswählen

    QString program="../batch/kdu_expand_batch";
    QStringList arguments;
    arguments << file_batch; // Parameteruebergabe an Batch-Programm, hier Dateiname
    QProcess *proc = new QProcess();

    proc->start(program, arguments);
    proc->waitForFinished(); // warten bis die Decodierung fertig ist
Das Problem ist jetzt, dass der Datei-öffnen Dialog die ganze Zeit zu sehen ist, und nur das letzte Bild meiner Bilderserie auch angezeigt wird. Decodiert werden alle, nur die Anzeige beschränkt sich auf das letzte Bild.
Decodiert wird jedes Bild einzeln, also das Kommandozeilenprogramm wird für jede Datei einzeln aufgerufen.
Davor hatte ich es mit einer manuellen Wartzeit gelöst, da wurde jedes Bild angezeigt.

Wäre nett, wenn du mir noch erklären könntest, wie ich auf das finished-Signal warten kann.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

QProcess::finished() ist ein SIGNAL, welches von QProcess brav emittiert wird, wenn der Prozess fertig ist. Das Signal rufst du nicht selber auf! Du musst jetzt nur einen SLOT einrichten, der auf das finished() von QProcess "angeschlossen" (connect) wird.
Das Problem ist jetzt, dass der Datei-öffnen Dialog die ganze Zeit zu sehen ist, und nur das letzte Bild meiner Bilderserie auch angezeigt wird. Decodiert werden alle, nur die Anzeige beschränkt sich auf das letzte Bild.
Und was macht waitForFinished()? Genau, es wartet - und blockiert! - bis der Prozess fertig ist. Derweil geschieht kein eventhandling, kein Neuzeichnen der GUI, usw. Deshalb: Lass den Prozess brav asynchron arbeiten. Der QProcess rührt sich dann schon!

Wenn du nicht weißt, wie du das finished()-SIGNAL auf einen eigenen SLOT legen sollst, schau dir noch mal die Beispiele in der Doku an - das sind Grundlagen, die du dir selber aneignen solltest.
don_js
Beiträge: 6
Registriert: 16. November 2010 11:03

Beitrag von don_js »

Super, jetzt hab ich's kapiert.
Danke für die genaue Erläuterung!

Code: Alles auswählen

    connect(proc, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(cont()));
    proc->start(program, arguments);
Ich hab' jetzt einfach eine Zwischenfunktion cont() auf SLOT gelegt, die nur eine Variable ändert, die ich dann in meinem Programmablauf abfrage und warte, falls sie noch den default-Wert hat.
Da mein Programm sonst weiterlaufen würde, und noch nicht darf.

Besten Dank nochmal, auch für die Erläuterung, dass waitForFinished blockiert - dann ergibt das alles Sinn auch für mich :)
Antworten