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?
Anstatt einen Thread zu verwenden, können Sie einfach in eine Schleife gehen, die processEvents
:
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.
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.
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.
Ich entschied mich für Davids Lösung, die am einfachsten zu sein schien.
Allerdings hatte ich noch ein paar Dinge zu erledigen:
Hier ist das Ergebnis als (mehr oder weniger) Pseudocode:
%Vor%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.
Ich habe QNetworkAccsessManager für die gleiche Notwendigkeit verwendet. Weil diese Klasse Verbindungen RFC-Basis verwalten (6 Prozess gleichzeitig) und nicht blockierend.
Sie müssen %code% oder %code% aufrufen, wenn Sie fertig sind - andernfalls wird Ihr Thread für immer laufen ...
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?
Sie müssen QThread::quit()
oder exit()
aufrufen, wenn Sie fertig sind - andernfalls wird Ihr Thread für immer laufen ...
Ich entschied mich für Davids Lösung, die am einfachsten zu sein schien.
Allerdings hatte ich noch ein paar Dinge zu erledigen:
Hier ist das Ergebnis als (mehr oder weniger) Pseudocode:
%Vor%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.
Tags und Links qt