![]() |
Upload mit IdHTTP in Thread führt immer zu Exception
Hallo,
ich habe in meinem Programm den Upload per IdHTTP in einen Thread verfrachtet. Vorher lief das ganze problemlos. Jetzt wird nach dem Upload (Datei kommt komplett auf dem Server an, PHP-Datei meldet Erfolg) jedes Mal der Exception-Teil des try-except-Blocks durchlaufen. Wenn ich ihn entferne, wird die nächste Zeile trotzdem nicht ausgeführt, es erscheint aber auch keine Meldung. Hier der relevante Code (gekürzt):
Delphi-Quellcode:
Der TMsMultiPartFormDataStream stammt auch hier aus der DP, habe aber auf die Schnelle das Topic nicht mehr gefunden.
procedure TUploadThread.Execute;
var Stream: TMsMultiPartFormDataStream; AW, DUDatei: String; DNr, ZF: Cardinal; begin IdHTTPC := TIdHTTP.Create(nil); with IdHTTPC do begin Name := 'IdHTTPC'; OnWork := IdHTTPWork; OnWorkBegin := IdHTTPWorkBegin; OnWorkEnd := IdHTTPWorkEnd; AuthRetries := 0; AuthProxyRetries := 0; AllowCookies := False; ProxyParams.BasicAuthentication := False; ProxyParams.ProxyPort := 0; Request.ContentLength := -1; Request.ContentRangeEnd := 0; Request.ContentRangeStart := 0; Request.ContentRangeInstanceLength := 0; Request.Accept := 'text/html, */*'; Request.BasicAuthentication := False; Request.UserAgent := 'Mozilla/3.0 (compatible; Indy Library)'; HTTPOptions := [hoForceEncodeParams]; end; // ... for DNr := 0 to Pred(DZahl) do begin // ... Stream := TMsMultiPartFormDataStream.Create; try // ... Stream.AddFile(DDateiFeld, DUDatei, ''); IdHTTPC.Request.ContentType := Stream.RequestContentType; Stream.PrepareStreamForDispatch; Stream.Position := 0; try AW := IdHTTPC.Post(DURL, Stream); except // Fehlerbehandlung, kommt immer end; LogToAdd := ' > Erfolgreich.'; Synchronize(SetLog); // Normalfall, kommt aber nie finally // ... FreeAndNil(Stream); end; end; FreeAndNil(IdHTTPC); // ... end; Meine Frage ist jetzt natürlich: Warum wird immer die Exception ausgelöst? Danke, ManuMF |
Re: Upload mit IdHTTP in Thread führt immer zu Exception
Um die Meldung der Exception zu sehen musst du das Programm über den Debugger starten, oder das OnTerminate Event des Threads zuweisen und dort die Exception, falls eine aufgetreten ist diese erneut werfen.
Wo tritt die Exception auf? |
Re: Upload mit IdHTTP in Thread führt immer zu Exception
Da nur ein Befehl im try-except-Block steht, vermute ich mal da. Aber weder so noch über Delphi (Start) wird die Meldung angezeigt. Kann ich sie trotzdem irgendwie anzeigen lassen?
|
Re: Upload mit IdHTTP in Thread führt immer zu Exception
Schreib doch in den Except Teil einfach
Delphi-Quellcode:
Oder eben sonst etwas mit E.Message machen.
except
on E:Exception do showmessage(E.Message); end; |
Re: Upload mit IdHTTP in Thread führt immer zu Exception
Danke, daran hab ich nicht gedacht :wall: , hatte nur raise probiert
Die Exception sagt: Ungültige Gleitkommaoperation :shock: Was hat das denn mit dem Upload zu tun? :gruebel: |
Re: Upload mit IdHTTP in Thread führt immer zu Exception
*push*
Könnte das ein Variablenproblem sein? |
Re: Upload mit IdHTTP in Thread führt immer zu Exception
(Kann ja leider nicht mehr bearbeiten)
Habe die Exception möglicherweise genauer lokalisiert. Das onWork des IdHTTP sieht so aus:
Delphi-Quellcode:
begin
UDateiA_A := AWorkCount DIV 1024; UDateiG_A := UDateiA_A + UDateiG_X; Prz_A := Round((UDateiA_A / UDateiA_M) * 100); Prz_G := Round((UDateiG_A / UDateiG_M) * 100); If ((UDateiA_A Mod 2) = 0) then Synchronize(UploadWork); If (uStopp) then Terminate; If (Terminated) then IdHTTPC.Disconnect; end;
Ich glaube, ich verzweifle daran noch... :cry: |
Re: Upload mit IdHTTP in Thread führt immer zu Exception
Hallo,
hast du das alles threadsafe aufgezogen? Die Indy-Kompo darf auf keinen Fall in den Mainthread grabschen, das muss alles synchronisiert werden. Hast du bei deiner ganzen Dividiererei vielleicht zwischendurch nen nuller drin? das solltest du prüfen. Die Gleitkommaeinheit sollte zwar rein theoretisch keine Exception diesbezüglich werfen, aber sicher ist sicher. |
Re: Upload mit IdHTTP in Thread führt immer zu Exception
Ich hab den IdHTTP im Thread deklariert. Der einzige Zugriff darauf erfolgt im Thread.Execute oder onWork (siehe 1. Beitrag). Und sonst mache ich alles bei Bedarf synchronisiert (siehe mein letzter Beitrag). Nur Variablen werden verändert, der Rest in einem Event mit Synchronize aufgerufen.
Was die Indys selbst mit dem MainThread machen, dazu kann ich natürlich nichts sagen. Ich habe auch die Vermutung, dass da irgendwo ne Null reinkommt, wenn ich es auskommentiere und per Hand alles auf 1 setze, läuft es ja. Ich verstehe nur nicht, warum wenn ich die Variablen lasse die Exception mit dem Handle kommt :gruebel: Außerdem wird nicht der Divisor, sondern höchstens der Dividend 0... naja, theoretisch. Nachtrag: Ich habe auf einen Verdacht das Showmessage durch ein Messagebox ersetzt. Das mit dem Handle kommt nicht mehr :-D Außerdem habe ich im onWork eine Prüfung auf 0 eingebaut. Die Meldung kommt trotzdem und lautet "Gleitkommadivision durch Null". Das kann aber nicht sein, da ich nun nirgendwo mehr durch 0 teile. |
Re: Upload mit IdHTTP in Thread führt immer zu Exception
Gleitkommavariablen sollten nicht auf 0 geprüft werden. Sondern auf < 1E-10 (z.B.). Aber hier sehe ich eigentlich nicht, das das ein Problem ist. Eigentlich.
Füge eine 'if aWorkCount>0' ein, und führe nur dann die Division aus. Umschließe die Division durch einen Try-Except-Block. Eins davon wird zum Ziel führen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz