Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi idFTP erhängt sich nach einer halben Stunde (https://www.delphipraxis.net/126313-idftp-erhaengt-sich-nach-einer-halben-stunde.html)

Admirandis 22. Dez 2008 20:54


idFTP erhängt sich nach einer halben Stunde
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo und frohe Weihnachten zusammen!

Ich schreibe ein kleines Filesharingprogramm und hab ein kleines Problem mit der IndyKompo. Grundsätzlich funktioniert alles, aber nach ziemlich genau nach einer halben Stunde läuft das Log nicht weiter (Verbinde immer wieder und trenne die Verbindung dann wieder) und wenn man auf irgendeinen Button drückt erhängt sich das Programm...

Ich hab ehrlich gesagt, keine Ahnung, wo der Fehler liegt, aber wäre sehr dankbar, wenn mir jemand weiterhelfen könnte!

Mfg Admirandis

SirThornberry 22. Dez 2008 21:24

Re: idFTP erhängt sich nach einer halben Stunde
 
hast du mal Pause gedrückt und geschaut an welcher Stelle er hängt?

Die Muhkuh 22. Dez 2008 21:42

Re: idFTP erhängt sich nach einer halben Stunde
 
Ich würds mir ja mal ansehen, aber da es ohne JVCL nicht geht, werd ich mir das auch nicht ansehen. :zwinker:

Andidreas 22. Dez 2008 22:47

Re: idFTP erhängt sich nach einer halben Stunde
 
um die verbindung zu nem ftp server aufrecht zu erhalten gibt es denn noop (mein ich zumindest das der so heißt ^^) befehl... probiers doch damit mal ;-)

Admirandis 23. Dez 2008 07:32

Re: idFTP erhängt sich nach einer halben Stunde
 
@Andidreas: Mit dem Noop hab ichs grad probiert, aber da erhängt er sich noch schneller! Nichtmal 1,5 min! Vorher hab ich ja immer connected und wieder disconnected! Wobei das mit dem Noop schöner wäre...

@Muhkuh: Hier ist der intressante Part:

Delphi-Quellcode:
procedure TForm1.threadRun(Sender: TIdThreadComponent);
var
 zefux: String;
 cnt: integer;
begin

if JvHLEditor1.Lines.Count > 15 then
    JvHLEditor1.Clear;   // Das ist nur ein Log von mir; hat nix mit der Funktion zu tun!

ak.Host := 'werdasliestistdoof.com';
ak.Username := 'angela';
ak.Password := 'merkel';

  while ak.Connected = false do
    begin
      ak.Connect;
      ak.ChangeDir('officeclipper');
      JvHLEditor1.Lines.Add('connected @ '+timetostr(now));   //Daten ins Log
    end;

ak.List(listbox1.Items, '', false);


if ((listbox1.Items.IndexOf(you) <> -1) and (hinti = false)) then
    begin
        hinti := true;
    end;

if listbox1.Items.IndexOf(you) <> -1 then
    begin
        download := true;
    end;

if upload = true then
    begin
        noti.Hide;
        progi.Show;
        form1.Caption := 'Uploading';
        JvTrayIcon1.BalloonHint('Upload', 'Sie laden jetzt eine Datei hoch xD', btInfo, 5000, true);
        richi.Lines.SaveToFile('C:\'+me);

        if listbox1.Items.IndexOf(me) <> -1 then
            ak.Delete(me);

        ak.Put('C:\'+me, me+'up', true);
        ak.Rename(me+'up', me);
        upload := false;
        form1.Caption := 'Upload succesful!';
        richi.Clear;
        progi.Hide;
        noti.Show;
    end;

if download = true then
    begin
        noti.Hide;
        progi.Show;
        form1.Caption := 'Downloading';
        JvTrayIcon1.BalloonHint('Download', 'Es wird eine Datei heruntergeladen', btInfo, 5000, true);
        ak.Get(you, 'C:\'+you, true);
        ak.Delete(you);
        richi.Lines.LoadFromFile('C:\'+you);
        download := false;
        richi.SelectAll;
        richi.CopyToClipboard;
        form1.Caption := 'Download succesful!';
        hinti := false;
        zefux := richi.text;
        if length(zefux) < 5 then
          zefux := 'Datei wurde heruntergeladen und ist im Clipboard!';
        progi.Hide;
        noti.Show;
        JvTrayIcon1.BalloonHint('Clipboard', zefux, btInfo, 5000, true);
    end;

if delall = true then
    begin
        for cnt := 0 to listbox1.Count-1 do
            ak.Delete(listbox1.items[cnt]);
        showmessage('Server ist wieder clean ;-)');
    end;


{    while ak.Connected = true do
    ak.disconnect; }

ak.Noop; // Vorher hab ich den Client wieder disconnected (s.o.). Der Noop klappt blöderweise auch net!

JvHLEditor1.Lines.Add('refreshed @ '+timetostr(now))   // Und wieder was für das Log ;-)

end;
Viele Grüße

Admirandis

Klaus01 23. Dez 2008 07:56

Re: idFTP erhängt sich nach einer halben Stunde
 
Guten Morgen,

wozu ist denn diese Schleife gut?

Delphi-Quellcode:
  while ak.Connected = false do
    begin
      ak.Connect;
      ak.ChangeDir('officeclipper');
      JvHLEditor1.Lines.Add('connected @ '+timetostr(now));   //Daten ins Log
    end;
Wäre es nicht besser:

Delphi-Quellcode:
  if not ak.Connected then
    begin
      ak.Connect;
      ak.ChangeDir('officeclipper');
      JvHLEditor1.Lines.Add('connected @ '+timetostr(now));   //Daten ins Log
    end;
Und noch zweie kleine Anmerkung, man sollte nicht auf = true oder = false
prüfen.

Zugriffe auf GUI (VCL) Elemente sollten synchronisiert erfolgen.

Grüße
Klaus

Admirandis 23. Dez 2008 08:00

Re: idFTP erhängt sich nach einer halben Stunde
 
Zitat:

Zitat von Klaus01
wozu ist denn diese Schleife gut?

Ich hab nur die Erfahrung gemacht, dass der Indy nicht immer sofort verbindet. Und falls eventuell mal ein Fehler auftritt, hab ich das so gleich sicher umgangen. Kann man aber auch anders machen!


Zitat:

Zitat von Klaus01
Und noch eine kleine Anmerkung, man sollte nicht auf = true oder = false prüfen.

Ok, nicht das Problem, aber hat das auch einen Hintergrund?


Zitat:

Zitat von Klaus01
Zugriffe auf GUI (VCL) Elemente sollten synchronisiert erfolgen.

Was genau meinst du damit?

Grüße Admirandis

Klaus01 23. Dez 2008 08:21

Re: idFTP erhängt sich nach einer halben Stunde
 
Zitat:

Zitat von Admirandis
Zitat:

Zitat von Klaus01
Und noch eine kleine Anmerkung, man sollte nicht auf = true oder = false prüfen.

Ok, nicht das Problem, aber hat das auch einen Hintergrund?

Es macht den Code lesbarer und wartbarer.

Zitat:

Zitat von Admirandis
Zitat:

Zitat von Klaus01
Zugriffe auf GUI (VCL) Elemente sollten synchronisiert erfolgen.

Was genau meinst du damit?

Die GUI bzw. die VCL Elemente sind nicht threadsave, d.h.
es kann zu Zugriffsverletzungen kommen wenn aucs einem Thread auf
die GUI zugegriffen wird.
Du kannst mal hier im Forum nach synchronize suchen - Du wirst
dann einige Beispiele finden.

Wäre es eventuell nich sinnvoller das Design zu ändern?

z.b.
soll eine Datei geladen werden - wird ein download thread gestartet
soll eine Datei hochgeladen werden - wird ein uploadthread gestartet.
Also zwei Threads, einer für den DownLoad und einer für den Upload.

Grüße
Klaus

Die Muhkuh 23. Dez 2008 08:23

Re: idFTP erhängt sich nach einer halben Stunde
 
Zitat:

Zitat von Admirandis
Zitat:

Zitat von Klaus01
wozu ist denn diese Schleife gut?

Ich hab nur die Erfahrung gemacht, dass der Indy nicht immer sofort verbindet. Und falls eventuell mal ein Fehler auftritt, hab ich das so gleich sicher umgangen. Kann man aber auch anders machen!

Soweit ich weiß, arbeiten die Indys blockierend, das heißt, dass Dein Programm erst weiter macht, wenn Connect erfolgreich (oder auch nicht) abgearbeitet wurde.

Ich würde mehr das hier vorschlagen:

Delphi-Quellcode:
try
  ak.Connect;
except
  on E: Exception do
    raise Exception.Create(E.Message); // kleine Fehlerbehandlung
end;

if ak.Connected then
  // Weitermachen mit dem restlichen Code
Zitat:

Zitat von Admirandis
Zitat:

Zitat von Klaus01
Und noch eine kleine Anmerkung, man sollte nicht auf = true oder = false prüfen.

Ok, nicht das Problem, aber hat das auch einen Hintergrund?

Ja, hat es

Admirandis 23. Dez 2008 08:30

Re: idFTP erhängt sich nach einer halben Stunde
 
@Klaus: Anfangs hatte ich die ganze idFTP-Kompo auch erst während der Laufzeit erstellt (Womit das synchronisieren wegfallen sollte), aber da wusste ich nicht, wie ich an die Daten für die Progressbar(AWorkCount etc.) komme... Wenn du mir sagst, wie ich das bewerkstellige wäre ich überglücklich =)

@Muhkuh: Ok, klingt logisch; werd das gleich mal ausprobieren! Und danke für den Link. Man lernt nie aus ;-)

Grüße Admirandis


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:36 Uhr.
Seite 1 von 2  1 2      

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