Blockiert eine Qt-Anwendung während des Herunterladens einer kurzen Datei

8

Ich schreibe eine Anwendung mit Qt4.

Ich muss eine sehr kurze Textdatei von einer bestimmten http-Adresse herunterladen.

Die Datei ist kurz und wird benötigt, damit meine App fortfahren kann. Daher möchte ich sicherstellen, dass der Download blockiert (oder nach ein paar Sekunden aussetzt, wenn die Datei nicht gefunden wird / nicht verfügbar ist).

Ich wollte QHttp :: get () verwenden, aber dies ist eine nicht blockierende Methode.

Ich dachte, ich könnte einen Thread verwenden: Meine App würde es starten und darauf warten, dass es fertig ist. Der Thread würde den Download übernehmen und beenden, wenn die Datei heruntergeladen wird oder nach einer Zeitüberschreitung.

Aber ich kann es nicht funktionieren lassen:

%Vor%

In der Methode, die den Thread erstellt, um den Download zu starten, mache ich Folgendes:

%Vor%

Aber das funktioniert nicht und meine App wartet weiter. Es sieht aus, dass der Slot 'onRequestFinished' nie aufgerufen wird.

Irgendeine Idee?

Gibt es einen besseren Weg, um das zu tun, was ich versuche?

    
Jérôme 30.10.2008, 16:06
quelle

6 Antworten

4

Anstatt einen Thread zu verwenden, können Sie einfach in eine Schleife gehen, die processEvents :

aufruft %Vor%

Dabei ist notFinished ein Flag, das vom onRequestFinished -Slot gesetzt werden kann.

Das ExcludeUserInput stellt sicher, dass GUI-bezogene Ereignisse während des Wartens ignoriert werden.

    
David Dibben 31.10.2008, 07:44
quelle
5
___ qstnhdr ___ Blockiert eine Qt-Anwendung während des Herunterladens einer kurzen Datei ___ answer252821 ___

Anstatt einen Thread zu verwenden, können Sie einfach in eine Schleife gehen, die %code% :

aufruft %Vor%

Dabei ist %code% ein Flag, das vom %code% -Slot gesetzt werden kann.

Das %code% stellt sicher, dass GUI-bezogene Ereignisse während des Wartens ignoriert werden.

    
___ answer265526 ​​___

Etwas spät, aber: Verwenden Sie diese Warteschleifen nicht, die korrekte Methode besteht darin, das done () -Signal von QHttp zu verwenden.

Das requestFinished-Signal von dem, was ich gesehen habe, ist nur für den Fall, dass Ihre Anwendung die Anfrage beendet hat, die Daten können immer noch auf dem Weg nach unten sein.

Sie brauchen keinen neuen Thread, richten Sie einfach den qhttp:

ein %Vor%

Vergessen Sie auch nicht, die Datei in processHttpGetFile zu löschen, da sie sich möglicherweise nicht auf der Festplatte befindet.

    
___ answer258496 ___

Ich entschied mich für Davids Lösung, die am einfachsten zu sein schien.

Allerdings hatte ich noch ein paar Dinge zu erledigen:

  • Ich musste die QEventLoop-Enum-Werte für Qt4.3.3 (die Version, die ich verwende) anpassen;
  • Ich musste die Anforderungs-ID verfolgen, um sicherzustellen, dass die while-Schleife beendet wird, wenn die Download-Anfrage beendet ist, und nicht, wenn eine andere Anfrage beendet ist;
  • Ich habe ein Timeout hinzugefügt, um sicherzustellen, dass die While-Schleife beendet wird, falls ein Problem auftritt.

Hier ist das Ergebnis als (mehr oder weniger) Pseudocode:

%Vor%     
___ tag123qt ___ Qt ist ein plattformübergreifendes Anwendungsentwicklungs-Framework, das häufig für die Entwicklung von Anwendungssoftware verwendet wird, die auf verschiedenen Software- und Hardwareplattformen ohne oder mit nur geringer Änderung der zugrundeliegenden Codebasis ausgeführt werden kann. Qt ist sowohl mit kommerziellen als auch mit Open-Source-Lizenzen verfügbar. ___ answer251631 ___

Wie wäre es, der GUI etwas Zeit zu geben, auf den Thread zu warten und dann aufzugeben?

Etwas wie:

%Vor%

Oder ...

Warum muss der GUI-Thread überhaupt auf den "Downloader Thread" warten? Wenn die App startet, erstellen Sie den Downloader-Thread, verbinden Sie das fertige () Signal mit einem anderen Objekt, starten Sie den Downloader-Thread und kehren Sie zurück. Wenn der Thread beendet ist, wird es das andere Objekt signalisieren, das Ihren Prozess fortsetzen kann.

    
___ answer26377678 ___

Ich habe QNetworkAccsessManager für die gleiche Notwendigkeit verwendet. Weil diese Klasse Verbindungen RFC-Basis verwalten (6 Prozess gleichzeitig) und nicht blockierend.

Ссылка

    
___ answer250950 ___

Sie müssen %code% oder %code% aufrufen, wenn Sie fertig sind - andernfalls wird Ihr Thread für immer laufen ...

    
___ qstntxt ___

Ich schreibe eine Anwendung mit Qt4.

Ich muss eine sehr kurze Textdatei von einer bestimmten http-Adresse herunterladen.

Die Datei ist kurz und wird benötigt, damit meine App fortfahren kann. Daher möchte ich sicherstellen, dass der Download blockiert (oder nach ein paar Sekunden aussetzt, wenn die Datei nicht gefunden wird / nicht verfügbar ist).

Ich wollte QHttp :: get () verwenden, aber dies ist eine nicht blockierende Methode.

Ich dachte, ich könnte einen Thread verwenden: Meine App würde es starten und darauf warten, dass es fertig ist. Der Thread würde den Download übernehmen und beenden, wenn die Datei heruntergeladen wird oder nach einer Zeitüberschreitung.

Aber ich kann es nicht funktionieren lassen:

%Vor%

In der Methode, die den Thread erstellt, um den Download zu starten, mache ich Folgendes:

%Vor%

Aber das funktioniert nicht und meine App wartet weiter. Es sieht aus, dass der Slot 'onRequestFinished' nie aufgerufen wird.

Irgendeine Idee?

Gibt es einen besseren Weg, um das zu tun, was ich versuche?

    
___
Phil Hannent 05.11.2008 15:39
quelle
3

Sie müssen QThread::quit() oder exit() aufrufen, wenn Sie fertig sind - andernfalls wird Ihr Thread für immer laufen ...

    
Andreas 30.10.2008 17:04
quelle
1

Ich entschied mich für Davids Lösung, die am einfachsten zu sein schien.

Allerdings hatte ich noch ein paar Dinge zu erledigen:

  • Ich musste die QEventLoop-Enum-Werte für Qt4.3.3 (die Version, die ich verwende) anpassen;
  • Ich musste die Anforderungs-ID verfolgen, um sicherzustellen, dass die while-Schleife beendet wird, wenn die Download-Anfrage beendet ist, und nicht, wenn eine andere Anfrage beendet ist;
  • Ich habe ein Timeout hinzugefügt, um sicherzustellen, dass die While-Schleife beendet wird, falls ein Problem auftritt.

Hier ist das Ergebnis als (mehr oder weniger) Pseudocode:

%Vor%     
Jérôme 03.11.2008 12:34
quelle
0

Ich habe QNetworkAccsessManager für die gleiche Notwendigkeit verwendet. Weil diese Klasse Verbindungen RFC-Basis verwalten (6 Prozess gleichzeitig) und nicht blockierend.

Ссылка

    
myd0 15.10.2014 08:15
quelle
-1

Wie wäre es, der GUI etwas Zeit zu geben, auf den Thread zu warten und dann aufzugeben?

Etwas wie:

%Vor%

Oder ...

Warum muss der GUI-Thread überhaupt auf den "Downloader Thread" warten? Wenn die App startet, erstellen Sie den Downloader-Thread, verbinden Sie das fertige () Signal mit einem anderen Objekt, starten Sie den Downloader-Thread und kehren Sie zurück. Wenn der Thread beendet ist, wird es das andere Objekt signalisieren, das Ihren Prozess fortsetzen kann.

    
Dusty Campbell 30.10.2008 20:24
quelle

Tags und Links