Einzelnen Beitrag anzeigen

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