![]() |
Multithreading mit Idftp der Indy-Komponente
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:
und so sieht die create der threads aus:
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;
Delphi-Quellcode:
und so sieht die execute aus:
constructor TMyOwnThread.create;
begin inherited create(true); freeOnTerminate := true; end;
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 |
Re: Multithreading mit Idftp der Indy-Komponente
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.
|
Re: Multithreading mit Idftp der Indy-Komponente
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? |
Re: Multithreading mit Idftp der Indy-Komponente
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. |
Re: Multithreading mit Idftp der Indy-Komponente
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... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz