AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Multithreading mit Idftp der Indy-Komponente
Thema durchsuchen
Ansicht
Themen-Optionen

Multithreading mit Idftp der Indy-Komponente

Ein Thema von ratsplayer · begonnen am 19. Aug 2008 · letzter Beitrag vom 19. Aug 2008
Antwort Antwort
ratsplayer

Registriert seit: 9. Apr 2007
3 Beiträge
 
#1

Multithreading mit Idftp der Indy-Komponente

  Alt 19. Aug 2008, 19:16
Hallo,

zuerstmal, falls dies im falschen Forum ist, entschuldigt dies bitte.
Ich habe Tutorials gelesen, gegoogelt und hier die Suche benutzt, aber ich finde keine Lösung zu diesem Problem.
Ich bin nur hobbymäßiger Programmierer und habe mich schon sehr viel über multithreading gelesen.

Nun zu meinem Problem:

Ich möchte mit 5 idftp-Komponenten (indy9) (heissen bei mir leecher1 - leecher5) dateien aus einer Liste herunterladen.
Wenn ein leecher eine Datei fertig hat, soll er sich eine nächste freie aussuchen und diese laden.
Das aussuchen, etc. ist auch nicht das Problem. Das funktioniert. Es werden auch nicht 2x die gleichen ausgesucht.
Nur es passiert häufig und unregelmäßig, dass ein leecher einfach nicht die nächste Datei lädt.
Ich habe auch dazu eine onerror-Meldung ausgeben lassen, diese ist auch immer unterschliedlich:

-Port command succesfull
-Socket Error #10014 Bad Adress
-.... viele weitere

Obwohl dort eigentlich kein Fehler entstehen dürfte.
Hiermit starte ich die Threads:

Delphi-Quellcode:
procedure Tform1.startethread(leecher,fileindex:integer);

begin

momleecher:=leecher;
if leecher=1 then Thread1 := TMyOwnThread.Create;
if leecher=2 then Thread2 := TMyOwnThread.Create;
if leecher=3 then Thread3 := TMyOwnThread.Create;
if leecher=4 then Thread4 := TMyOwnThread.Create;
if leecher=5 then Thread5 := TMyOwnThread.Create;

if leecher=1 then momfileindex1:=fileindex;
if leecher=2 then momfileindex2:=fileindex;
if leecher=3 then momfileindex3:=fileindex;
if leecher=4 then momfileindex4:=fileindex;
if leecher=5 then momfileindex5:=fileindex;

if leecher=1 then Thread1.Resume;
if leecher=2 then Thread2.Resume;
if leecher=3 then Thread3.Resume;
if leecher=4 then Thread4.Resume;
if leecher=5 then Thread5.Resume;

end;
und so sieht die create der threads aus:

Delphi-Quellcode:
constructor TMyOwnThread.create;
begin

inherited create(true);
freeOnTerminate := true;

end;
und so sieht die execute aus:

Delphi-Quellcode:
procedure TMyOwnThread.Execute;
var datei:string;
bzt:boolean;
begin

datei:='';
if momleecher=1 then
                begin
                form1.Shape1.Brush.Color:=clgreen;
                datei:=form1.Leechbox.Items[momfileindex1];

                if fileexists(datei) = false then stream1:=Tfilestream.Create(datei,fmcreate)
                                        else stream1:=tfilestream.Create(datei,fmOpenReadWrite);
                stream1.Position:=stream1.Size;
                try
                 form1.leecher1.Get(datei,stream1,true);
                except

                on E: Exception do
                        form1.label6.caption:= E.Message;

                end;

ich habe irgendwie das gefühl, dass sich die threads oder die idftps gegenseitig stören.
Kann mir irgendwer helfen?
Bin hier total am Verzweifeln, hab schon alles mögliche versucht...
Wäre wirklich nett.

Mit freundlichen Grüßen,

ratsplayer
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Multithreading mit Idftp der Indy-Komponente

  Alt 19. Aug 2008, 19:19
Den Hinweis, der beim Erstellen einer Ableitung von TThread in der Unit steht, darf man ruhig lesen: Du darfst aus dem Thread nicht direkt auf VCL-Komponenten zugreifen.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
ratsplayer

Registriert seit: 9. Apr 2007
3 Beiträge
 
#3

Re: Multithreading mit Idftp der Indy-Komponente

  Alt 19. Aug 2008, 19:37
Danke erstmal für die Antwort.

Zum Thema:
Wie soll ich das sonst machen, und warum funktioniert das trotzdem größtenteils???
Zu Beginn funktioniert das ja, aber es gibt immer Ausnahmen, die Probleme machen?
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Multithreading mit Idftp der Indy-Komponente

  Alt 19. Aug 2008, 19:41
Probleme mit Threads sind häufig schwierig zu fassen.
Du musst dafür sorgen, dass alle Daten der Threads in Feldern der Thread-Klasse oder globalen Variablen liegen. Außerdem sollte jeder Thread sein eigenes IdFTP haben.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
ratsplayer

Registriert seit: 9. Apr 2007
3 Beiträge
 
#5

Re: Multithreading mit Idftp der Indy-Komponente

  Alt 19. Aug 2008, 19:45
Jeder Thread hat sein eigenes Idftp. Jeder Thread wird auch gestartet und im onworkend beendet und anschließend neu gestartet.
Ich hab auch schon für jeden Unsinn ne eigene Variable gemacht gehabt. Jetzt steht im execute ja die variable Datei, welche von allen benutzt wird... Ansonsten müssten alle Threads eigene Variablen haben.
Ich verzweifel noch daran...
  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 17:59 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