Einzelnen Beitrag anzeigen

Kolan

Registriert seit: 25. Mär 2009
1 Beiträge
 
#1

Threads - IdHTTP.Post sendet nicht

  Alt 25. Mär 2009, 09:13
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]
  Mit Zitat antworten Zitat