Autor Beitrag
crt
Hält's aus hier
Beiträge: 6

Gentoo, Win XP Prof
D7 Prof
BeitragVerfasst: So 05.03.06 03:11 
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):
ausblenden volle Höhe 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
Hält's aus hier
Beiträge: 1



BeitragVerfasst: 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