AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

IdFTP + Threads

Offene Frage von "naujo"
Ein Thema von naujo · begonnen am 30. Okt 2006 · letzter Beitrag vom 6. Nov 2006
Antwort Antwort
naujo

Registriert seit: 31. Jan 2005
25 Beiträge
 
Delphi 6 Enterprise
 
#1

IdFTP + Threads

  Alt 30. Okt 2006, 14:54
Hallo zusammen!

Ich möchte unter Delphi 6 mit Indy 10 einen kleinen FTP-Client programmieren.

Das "Grundgerüst" mit der Finktionalität steht schon. Nun habe ich ein paar kleine Probleme.

Das Programm "schläft" bei einer FTP-Übertragung ein. Um genauer zu sein, die Oberfläche in einem zu großen Intervall aktuallisiert. Nämlich immer wenn das TOnWork Event von IdFTP eintritt. Und das ist bei großen Dateien und langsamen Verbindungen einfach zu langsam. Außerdem kann man den Verbindungsversuch nicht abbrechen, da Indy den Hauptthread "blockiert". Das sind nur ein paar Schwierigkeiten.

AntiFrezze bringt nichts, da ich die Oberfläche und die Programmligik komplett von einander getrennt habe. Die Infos werden per Procedure of Object ausgetauscht. In anderen Forenbeiträgen wird auch da von berichtet, dass AntiFrezze in manchen Fällen nicht funktioniert.

Nun habe ich mir gedacht, dann mache ich das eben in einem eingenen Thread. Das habe ich in diveren Beiträgen auch schon gelesen. Und ich habe mir auch das Tutorial von Luckie durchgelesen.

Gesagt getan, nicht von TObject abgeleitet sondern von TThread, also meine FTP-Klasse die "Wrapper" für die IdFTP-Klasse dient. Die Methode Execute überschrieben...

Delphi-Quellcode:
procedure TFTPHandle.Execute;
begin
  inherited;

  while not Terminated do
  begin
    WaitFor;
  end;

  OutputDebugString(PChar('Terminated = ' + PChar(BoolToStr(Terminated, True))));
end;
Und nun kommen wir zu meinem Problem. Ich möchte den Thread über Windows-Messages steuern.
Also habe ich mir ein paar Nachichten deklariert:

Delphi-Quellcode:
WM_FTPBase = WM_USER + 1;
WM_FTPConnectToServer = WM_FTPBase + 1;
WM_FTPErrorHappend = WM_FTPBase + 2;
WM_FTPCommandSuccessful = WM_FTPBase + 3;
WM_FTPUploadFileList = WM_FTPBase + 4;
WM_FTPDownloadFileList = WM_FTPBase + 5;
(...)
(Ja, ich weiß man kann den Nachrichten auch Parameter anhängen, dann hätte ich mir ein paar sparen können)

Nun weiß ich nicht wie der Thread auf die Nachrichte reagieren soll.

Ich habe diesen ersten Ansatz:
Delphi-Quellcode:
procedure WMFTPConnectToServer(var Message: TMessage); message WM_FTPConnectToServer;
procedure WMFTPCancelCurrentAction(var Message: TMessage); message WM_FTPCancelCurrentAction;
Diese Methoden werden aber nie aufgerufen, da schon das PostThreadMessage(FTPInstance.ThreadID, WM_EAEFTPConnectToServer, 0, 0) fehl schlägt, d.h. es wird False zurückgegeben. Also GetLastError aufgerufen und was ist darin? Eine "0"...

Noch eine kleine Zusatzinfo, das Objekt FTPIntance wird im initialization-Abschnitt einer anderen Unit erzeugt.

So sieht der constructor aus:
Delphi-Quellcode:
inherited Create(False);
FreeOnTerminate := True;
(...)

Dann gibt es noch ein kleines Problem beim Beenden der Anwendung, wenn ich Terminate aufrufe. Dann ist der Thread auch weg, das kann habe ich mit dem Process Explorer von Sysinternals kontrolliert. Nur leider "hängt" dann der Hauptthread fest.

Noch ein paar kleine Hardware- und Softwareinfos:
Windows XP Pro (SP2)
Delphi 6 Ent mit Update Pack 2
Pentium 4 mit HT

Wäre schön, wenn ihr mir helfen könntet.

MfG

naujo

// Nachtrag:
Den Hänger beim Beenden konnte ich beseitigen.
Im finalization-Abschnitt war noch ein Free vorhanden, dass hab ich jetzt rausgenommen.
Da beim Create ja schon FreeOnTerminate := True festgelegt wurde.
  Mit Zitat antworten Zitat
naujo

Registriert seit: 31. Jan 2005
25 Beiträge
 
Delphi 6 Enterprise
 
#2

Re: IdFTP + Threads

  Alt 6. Nov 2006, 08:41
Hallo zusammen!

Hat niemand von euch eine Idee, warum die Kommunikation zwischen dem Hauptthread und dem Workerthread nicht funktioniert?

MfG

naujo
  Mit Zitat antworten Zitat
panzerfischer

Registriert seit: 18. Sep 2006
Ort: Ilmenau
33 Beiträge
 
#3

Re: IdFTP + Threads

  Alt 6. Nov 2006, 09:56
vielleicht werden deine threads nicht richtig syncronisiert vll mal mit dem befehl Synchronize({Procedure}); ausprobieren

oder aus dem thread Proceduren vom hauptprogramm aufrufen und evtl. globale variablen definieren und setzen vor der ausgabe

mfg
  Mit Zitat antworten Zitat
naujo

Registriert seit: 31. Jan 2005
25 Beiträge
 
Delphi 6 Enterprise
 
#4

Re: IdFTP + Threads

  Alt 6. Nov 2006, 10:05
Hi,

teilweise rufe die Proceduren vom Hauptthread auf, das klappt auch alles.
Aber ich möchte halt die aufrufen, wo ich mir sicher bin, dass die sehr lange brauchen werden.

MfG

naujo
  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 15:38 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