Threads - IdHTTP.Post sendet nicht
Hello World...
Nach langer Zeit der "Abstinenz" darf ich mal wieder was mit Delphi machen und hab natürlich direkt ein Problem mit einer Datei-Uploadfunktion, die ich in einen Tread auslagern möchte. Allgemeine Programminfo: Ein paar Dateien werden gepackt, in einen Memorystream geladen und zusammen mit einer Ziel-URL im thread.create übergeben. Da Threads für mich auch nicht alltäglich waren hab ich mich erstmal an das hier im Forum oft genannte Tutorial gehalten, nun aber das Problem, dass der Thread scheinbar korrekt ausgeführt wird, sich jedoch am Post des IdHTTP ohne Meldung aufhängt. Wäre schön, wenn sich das jemand anschauen und mir weiterhelfen könnte - ich geh sehr stark davon aus, dass ich irgendeinen blöden Anfängerfehler gemacht habe ;) Start des Threads:
Delphi-Quellcode:
und hier der (VCL) Thread selber:
[...]
mstream := TMemoryStream.Create; mstream.LoadFromFile('data.zip'); mstream.Position := 0; PostData := TIdMultiPartFormDataStream.Create; PostData.AddObject('data', 'zip', mstream, 'data.zip'); // IdHTTP1.Post(url_upload, PostData); // Problemloses Senden der Daten ohne Thread, jedoch "einfrieren" der Application SendThread := TSendThread.Create(url_upload, PostData); [...]
Delphi-Quellcode:
Zu erwähnen wäre hier vielleicht noch, dass im Execute das st_status + Synchronize nicht mehr ausgeführt wird. Ohne das sleep würde der Thread sich beim st_http.Post direkt beenden, mit dem sleep seh ich wenigstens im Process Explorer dass er erstellt wird und sich kurz darauf wieder schliesst.
unit Unit4;
interface uses Classes {$IFDEF MSWINDOWS} , Windows {$ENDIF}, IdMultiPartFormData, IdHTTP, IdComponent, Unit1; type TSendThread = class(TThread) st_url, st_status : String; st_progress, st_size : Integer; st_data : TIdMultiPartFormDataStream; st_http : TidHTTP; private protected procedure Execute; override; procedure Sync; public constructor Create(url : String; data : TIdMultiPartFormDataStream); end; implementation { SendThread } procedure TSendThread.Sync; begin Form1.Sync_SendThread(st_status, st_progress); // sleep(3000); end; constructor TSendThread.Create(url : String; data : TIdMultiPartFormDataStream); begin st_http := TIdHTTP.Create(nil); st_url := url; st_data := TIdMultiPartFormDataStream.Create; st_data := data; st_status := 'Ready'; Synchronize(Sync); inherited Create(false); end; procedure TSendThread.Execute; begin st_status := 'starting...'; Synchronize(Sync); sleep(2000); st_http.Post(st_url, st_data); st_status := 'sent'; Synchronize(Sync); end; end. Besten Dank schonmal vorab :) [edit - typos] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz