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:
[...]
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);
[...]
und hier der (
VCL) Thread selber:
Delphi-Quellcode:
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.
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.
Besten Dank schonmal vorab
[edit - typos]