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