AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi IdFTP.Connect springt raus
Thema durchsuchen
Ansicht
Themen-Optionen

IdFTP.Connect springt raus

Ein Thema von Gloegg_FHBI · begonnen am 27. Apr 2010 · letzter Beitrag vom 28. Apr 2010
Antwort Antwort
Benutzerbild von Gloegg_FHBI
Gloegg_FHBI

Registriert seit: 28. Nov 2006
Ort: Neuss
46 Beiträge
 
Delphi 10 Seattle Professional
 
#1

IdFTP.Connect springt raus

  Alt 27. Apr 2010, 22:36
Hallo Forum,

Ich möchte in meinem Programm ein paar Dateien nebenher hochladen. Dazu habe ich einen einfachen Thread programmiert.
Leider springt er beim Aufruf von ftp.Connect; einfach aus der Methode, ohne Exception, als hätte ich exit; aufgerufen.

Hier der Quelltext des Threads:

Delphi-Quellcode:
unit uFTPThread;

interface

uses
  Classes, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdExplicitTLSClientServerBase, IdFTP;

type
  TFTPThread = class(TThread)
  private
    { Private-Deklarationen }
    ftp : TIdFTP;
    fIP : string;
    fPort : integer;
    fUser, fPassword : string;
    fActive : boolean;
    fTubeFile, fUserFile : string;
    procedure UpdateUsers;
    procedure UpdateTubes;
  protected
    procedure Execute; override;
  public
    property Host : string read fIP write fIP;
    property Port : integer read fPort write fPort;
    property Username : string read fUser write fUser;
    property Password : string read fPassword write fPassword;
    property Userfile : string read fUserfile write fUserfile;
    property Tubefile : string read fTubefile write fTubefile;
    property Active : boolean read fActive write fActive;
  end;

implementation

{ TMachineThread }

uses
  SysUtils, IdFTPCommon;

procedure TFTPThread.Execute;
begin
  ftp := TIdFTP.Create(nil);
  // Binary Transfer
  ftp.TransferType := ftBinary;

  if Active then
  begin
    try
      ftp.Host := fIP;
      ftp.Port := 21;
      ftp.Username := fUser;
      ftp.Password := fPassword;
      ftp.AutoLogin := true;
      ftp.Connect;
      ftp.Quote('gtwr');
      ftp.ChangeDir('Directory');

      if fUserFile <> 'then
      begin
        UpdateUsers;
      end;
      sleep(100);

      if fTubeFile <> 'then
      begin
        UpdateTubes;
      end;
      sleep(100);

      ftp.Disconnect;
    end;
  ftp.Free;
end;

procedure TFTPThread.UpdateTubes;
begin
  fTaskname := 'Aktualisiere Schlauchdatei';
  Synchronize(setTaskname);
  ftp.Put(fTubefile,'SCHLAUCH.CSV');
end;

procedure TFTPThread.UpdateUsers;
begin
  fTaskname := 'Aktualisiere Benutzerdatei';
  Synchronize(setTaskname);
  ftp.Put(fUserfile,'USER.CSV');
end;

end.
Aufgerufen habe ich es so:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  t : TFTPThread;
begin
   t := TFTPThread.Create(true);
  t.Host := '192.169.178.20';
  t.Port := 21;
  t.Username := 'User';
  t.Password := 'password';
  t.Userfile := 'C:\temp\user.txt';
  t.Tubefile := 'C:\temp\tube.txt';
  t.Active := true;
  t.Resume;
end;
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#2

Re: IdFTP.Connect springt raus

  Alt 28. Apr 2010, 06:49
Wahrscheinlich kommt es bei Connect zu einer Exception die du nicht abgefangen hast.
Exceptions innerhalb von Threads gehen sang & klanglos verloren, solange man nicht etwas dagegen tut.
Mein Tipp:
Erzeuge das TIdFTP-Objekt im Hauptthread, stelle im Hauptthread die Verbindung mit Connect her und übergebe dann das fertige Objekt deinem Thread.
Dadurch kannst du dir auch die Properties Host, Port, Username & Passwort sparen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.171 Beiträge
 
Delphi 12 Athens
 
#3

Re: IdFTP.Connect springt raus

  Alt 28. Apr 2010, 07:08
Sang und Klanglos geht da nix unter.
Exceptions, welche in einem TThread-Ableger nicht abgefangen werden, werden gespeichert und können abgefragt werden.

PS: Wann wird eigentlich dein Thread-Objekt freigegeben?
FreeOnTerminate wird ja nicht gesetzt und selber freigeben tust du das t anscheinend auch nicht,
was demnach natürlich in einem Speicherleck enden muß.

Nja, wie dem auch sei,
* entweder du schreibst folgenden Code in eine Ereignisprozedur (mit Sender statt t) und registrierst diese bei t.OnTerminate und stellst natürlich t.FreeOnTerminate noch auf True
* oder das Selbe, nur daß DoTerminate überschrieben wird, statt OnTerminate zu nutzen
* oder du gibst irgendwo im Hauptprogramm das t frei, nachdem der Thread mit seiner Arbeit beendet hat, und führst ebenfalls vorher nachfolgenden Code aus.

Delphi-Quellcode:
if Assigned(t.FatalException) then
  ShowException(t.FatalException, nil);

// oder

if Assigned(t.FatalException) then
  ShowMessage(Exception(t.FatalException).Message);
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#4

Re: IdFTP.Connect springt raus

  Alt 28. Apr 2010, 07:16
Zitat von himitsu:
Sang und Klanglos geht da nix unter.
Exceptions, welche in einem TThread-Ableger nicht abgefangen werden, werden gespeichert und können abgefragt werden.[/delphi]
Es kommt natürlich immer auch auf die Delphi-Version an.
In D5 gibt es z.B. keinen richtigen Support für Exceptions in Threads.
Man muss die Exception selbst abfangen, das Exception-Objekt in der Thread-Klasse verfügbar machen und im Hauptthread auswerten.
Wenn man nichts tut, wird die Exception weder im Programm noch im integrierten Debugger (!) angezeigt.
Sang und klanglos ist da doch eine treffende Beschreibung.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.171 Beiträge
 
Delphi 12 Athens
 
#5

Re: IdFTP.Connect springt raus

  Alt 28. Apr 2010, 07:57
Seit mindestens Delphi 7 trifft dieses ja nicht mehr zu und hier haben alle Beteiligten grade auch noch mindestens ein 2007er.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Gloegg_FHBI
Gloegg_FHBI

Registriert seit: 28. Nov 2006
Ort: Neuss
46 Beiträge
 
Delphi 10 Seattle Professional
 
#6

Re: IdFTP.Connect springt raus

  Alt 28. Apr 2010, 09:50
Danke für die Antworten.
ums freigeben des Threads habe ich mich noch nicht gekümmert, das war mir erstmal egal, wichtiger war, warum das connect nicht funktioniert, bzw. in einem thread komische dinge macht.

Gestern abend hatte ich zum testen den FTP-Server meiner NAS zuhause benutzt. Heute morgen auf der Arbeit hab ich zu meinem FTP-Server von meinem Webspace gewechselt und siehe da, es funktioniert. (Ich musste nur ftp.Login; rausnehmen, da autologin per default auf true ist)
Da kam dann auch erstmal ein EIdReplyRFCError mit "You are already logged in!" aus der Delphi IDE.

Vielleicht muss ich noch Passiv/Aktiv oder eine andere verbindungseigenschaft richtig setzten, damit es dann auch zuhause im LAN klappt.
  Mit Zitat antworten Zitat
andreasm82

Registriert seit: 23. Nov 2009
66 Beiträge
 
#7

Re: IdFTP.Connect springt raus

  Alt 28. Apr 2010, 20:22
Zitat:
einfach aus der Methode, ohne Exception,
In deimem Quellcode steht ja auch gar kein Except!

Du nimmst ein try ... end; , aber verwendest kein except dabei.
try ... except ... end; würde das Problem lösen, denke ich.

Delphi-Quellcode:
  try
    // tue was
  except
    on E:Exception do
    begin
       
       showmessage(E.ClassName+':'+E.Message);

    end;
  end;
  Mit Zitat antworten Zitat
Benutzerbild von Gloegg_FHBI
Gloegg_FHBI

Registriert seit: 28. Nov 2006
Ort: Neuss
46 Beiträge
 
Delphi 10 Seattle Professional
 
#8

Re: IdFTP.Connect springt raus

  Alt 28. Apr 2010, 21:01
Oh, sorry, da hatte ich den Code zum posten etwas vereinfachen wollen und das except gelöscht, aber das try drinbehalten. Im echten Programm gibt es natürlich einen except-block.
Für ein Testprogramm hatte ich dann beides rausgenommen und da hat es sich ebenso wie beschrieben verhalten.

Jedenfalls scheint es an meiner NAS zu liegen, da es mit ein paar anderen FTP-Servern ohne Probleme geklappt hat.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:36 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