Entwickler-Ecke
Internet / Netzwerk - IdHTTP.Post: OnWork & OnWorkEnd werden zu früh aufgerufen
crt - So 05.03.06 03:11
Titel: IdHTTP.Post: OnWork & OnWorkEnd werden zu früh aufgerufen
Hi!
Ich lade in einem Thread eine Datei über IdHTTP.Post hoch.
Den Status (Geschwindigkeit, Fortschritt) lasse ich auf der Haupt-Form über Synchronize ausgeben.
Das Problem ist jetzt, dass OnWork genau 171mal aufgerufen wird und danach OnWorkEnd. Das alles geschieht in einem Zeitraum von ca. 1-2 Sekunden. Der Upload ist danach aber noch nicht fertig.
In der Zeit bis zum Upload-Ende wird kein OnWork mehr aufgerufen.
Hier der Code (die wichtigsten Stellen):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| procedure TUploadThread.IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer); var t:double; begin t := (gettickcount-t1)/1000; if t <= 0 then t := 1; speed := round((AWorkCount/1024)/t); progress := round(AWorkCount/size*100); Synchronize(UpdateListItem); end;
procedure TUploadThread.IdHTTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode); begin Synchronize(SendWorkEnd); end;
procedure TUploadThread.Execute; ... begin idHTTP := TidHTTP.Create(Form1); IdHTTP.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)'; IdHTTP.SendBufferSize := 1024*6; idHTTP.OnWork := IdHTTPWork; idHTTP.OnWorkEnd := IdHTTPWorkEnd; ... repeat ... t1 := gettickcount; IdHTTP.Post(UPLOAD_URL, PicData, mResponse); ... until false; end; |
Z4ppy - Fr 15.04.11 18:24
Ich weiss, dass dieses Thema uralt ist. Trotzdem möchte ich (weil man es fast nirgends findet) hier die Ursache dieses Phänomens nennen:
Es ist die Firewall. Diese schalten sich in die Datenübertragung ein, die Daten werden vom Programm an die Firewall gesendet, von der Firewall analysiert (?) und gleichzeitig zum Server hochgeladen. Da die Übertragung vom Programm an die Firewall natürlich um einiges schneller geht als der Upload zum Server, meint das Programm beim Abschluss dieser Übertragung, der Upload sei fertig und das OnWorkEnd Event wird aufgerufen.
Ich habe bisher leider keinen Weg gefunden, dies zu verhindern (mal abgesehen von Firewallabschaltung oder Firewallregeln, dass der ausgehende Traffic nicht gecached werden soll).
MfG Z4ppy
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!