[Win] GetHTTPFile (Downloaden in memory und mehr)

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Lord
Beiträge: 313
Registriert: 21.01.2008 19:11

Re: [Win] GetHTTPFile (Downloaden in memory und mehr)

Beitrag von Lord »

HeX0R hat geschrieben:...
Das Abbrechen der Threads ging allerdings vorher auch schon, man muss nur folgendes beachten:
Wurde der Download noch nicht gestarted, weil er z.B. vom Host noch auf Warteschleife ist,
hängt der Thread in der Funktion InternetReadFile_() fest und kann nicht so ohne weiteres ordnungsgemäss beendet werden.
...
Ich habe nochmal etwas weitergetestet. Bei mir bleibt
der Thread tatsächlich in dieser Zeile hängen:

Code: Alles auswählen

hData = InternetOpenUrl_(hINet, *B\URL, 0, 0, *B\ConnectFlags, 0)
Wenn man dann StopAsyncDownload() ausführt, ist
kein erneuter DL mehr möglich. Das Programm muß dann
beendet und neu gestartet werden.
Gibt es eine Möglichkeit, bei InternetOpenURL_() einen
kürzeren Timeout (nur für diesen Thread) einzustellen?
Jetzt dauert es exakt 1 Minute, bis das Tmieout eintritt.
Aber auch danach konnte ich keinen erneuten erfolg-
reichen DL starten.
Bild
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: [Win] GetHTTPFile (Downloaden in memory und mehr)

Beitrag von HeX0R »

Also so kommen wir nicht weiter.

Geht denn das neue Beispiel bei dir?
Kannst du die Downloads dort ordentlich abbrechen mit den Buttons?

Gib mir doch mal was, was ich in meine IDE kopieren, F5 drücken kann und diesen Effekt sehe.
Falls du mit dubiosen Quellen arbeitest oder der Code warum auch immer geheim gehalten werden soll,
kannst du mir das auch gerne per PN schicken.
Lord hat geschrieben: Gibt es eine Möglichkeit, bei InternetOpenURL_() einen
kürzeren Timeout (nur für diesen Thread) einzustellen?
Entschuldige, das hatte ich völlig übersehen, es gibt nun noch einen optionalen Timeout-Parameter (in ms).
Default ist in der tat 60000, also eine Minute.
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: [Win] GetHTTPFile (Downloaden in memory und mehr)

Beitrag von HeX0R »

O.k., wieder eine neue Version.

Das große Problem bei asynchronen Downloads ist,
dass sie bei erfolgreichem Download eine Meldung an die Windows-Queue absenden.
Warum ein Problem?
Nun ja, das kann mitunter ein paar millisekunden dauern, bis es in der Queue angekommen ist und mittlerweile
ist der User evtl. ungedultig geworden und hat das Handle bereits destroyed.
Dann kracht es natürlich.

Also blieb mir nix andere übrig, als die Handles mitzuschleppen.

Ein Nachteil: Es wird nun zum kompilieren mindestens Version 4.5 benötigt.
Weil ich eine Liste in einer Struktur habe.
Es sollte aber auch kein großes Problem darstellen, das für ältere Versionen zu einer globalen List umzubauen.
Ich habe dazu aber keine Lust, mir gefällt es so besser ;)

Das ganze sollte mittlerweile sehr robust sein.

Ausserdem gibt es noch eine neue Funktion: FreeAll(), die sollte am Ende des Programms aufgerufen werden,
um alles, was noch nicht "befreit" wurde, aus dem Speicher zu entfernen.
Lord
Beiträge: 313
Registriert: 21.01.2008 19:11

Re: [Win] GetHTTPFile (Downloaden in memory und mehr)

Beitrag von Lord »

Achtung! Neue Version.
.:M:. hat geschrieben:Sehr schön, Danke. :allright:
Dem kann ich mich jetzt uneingeschränkt anschließen
und die Include nur empfehlen.
Selbst bei einem DAU wie mir scheint sie jetzt
"bulletproof" zu sein.
Bild
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: [Win] GetHTTPFile (Downloaden in memory und mehr)

Beitrag von HeX0R »

Noch schnell was dazugebastelt:

\GetFileSize(Handle) -> Gibt Größe des Downloads zurück.
\AsyncDownloadPercentLoaded(Handle) -> Gibt Fortschritt des Downloads als Float zurück: 0.0 = 0% 1.0 = 100%

Siehe das aktualisierte zweite Beispiel hier.
Lord
Beiträge: 313
Registriert: 21.01.2008 19:11

Re: [Win] GetHTTPFile (Downloaden in memory und mehr)

Beitrag von Lord »

Hallo HeXor!

Leider funktioniert Deine GetHTTPFile()-Include nicht
mehr mit der Version 4.61 von PB.
In der Prozedur GetHTTPFile_Thread() liefert der Auf-
ruf von InternetOpenUrl_() immer eine #NULL, es wird
also keine Verbindung aufgebaut.
Ist die Include schon in der neuen PB-Version getestet?
Bild
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: [Win] GetHTTPFile (Downloaden in memory und mehr)

Beitrag von HeX0R »

Lord hat geschrieben:Ist die Include schon in der neuen PB-Version getestet?
Habe ich eben gemacht, kann keine Probleme feststellen.
Hätte mich auch gewundert.
Lord
Beiträge: 313
Registriert: 21.01.2008 19:11

Re: [Win] GetHTTPFile (Downloaden in memory und mehr)

Beitrag von Lord »

Hallo HeX0R!

Du hast (natürlich) recht. Die (oder das ?) Include
macht keine Problem (mehr). :shock:

Ich habe es gerade, nachdem ich die 2 Programme,
in denen ich die/das Include verwende, nochmals
kompiliert - und siehe da: et löppt. :oops:

Ich kann nicht sagen, woran es die Tage vorher ge-
legen hat, daß ich keine Verbindung bekam.
Ich hatte den Sourcecode sowohl mit PB 4.51 als
auch PB 4.61 (PB 4.60 habe ich "übersprungen") in
32 Bit als auch 64 Bit kompiliert. Die beiden 4.51er
Versionen bekamen Verbindung, die beiden 4.61er
keine.
Andere mit 4.61 kompilierte Programme, die ich
dann getestet hatte, bekamen Verbindung ins Netz.
So war ich dann davon ausgegangen, daß es viel-
leicht an HttpGetFile liegen könnte.

Aber so bin ich auch zufrieden. Danke nochmals für
die Bereitstellung des Codes und die geleisteten Hilfe-
stellungen. :allright:
Bild
The Shark
Beiträge: 37
Registriert: 03.03.2011 00:03

Re: [Win] GetHTTPFile (Downloaden in memory und mehr)

Beitrag von The Shark »

Hab mir heute deine Include angeschaut. Funktioniert auch super. :allright:
Einen Bug hab ich allerdings gefunden:
Wenn man GetFile() benutzt funktionieren AsyncDownloadPercentLoaded() und AsyncDownloadBytesLoaded() nicht.
Ich hab dann nach ein bisschen ausprobieren folgenden Fix gefunden:

das (313ff):

Code: Alles auswählen

               	If Bytes
               		WriteData(*B\FileHandle, *B\Result, Bytes)
                  EndIf
ersetzen mit dem:

Code: Alles auswählen

               	If Bytes
               		fSize + Bytes
               		WriteData(*B\FileHandle, *B\Result, Bytes)
               		*B\BytesLoaded = fSize
                  EndIf
und oben noch ein

Code: Alles auswählen

fSize = 0
hin.
Ich hab allerdings keine Ahnung, ob das so richtig ist, oder das irgendwelche unerwünschten Seiteneffekte hat. Ersetzt man fSize mit Size passieren zumindest mal sehr komische Sachen.

Ich fänds super, wenn du da mal drübergucken und das einbauen könntest :)
Bild
Bild
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: [Win] GetHTTPFile (Downloaden in memory und mehr)

Beitrag von HeX0R »

The Shark hat geschrieben:Ich fänds super, wenn du da mal drübergucken und das einbauen könntest :)
Ich hoffe das stimmt so jetzt.
Danke für die Info!
Antworten