Hi DPler!
Ich hab hier einen Thread, der mit IdHTTP Dateien von Webservern runterlädt. Man soll jetzt die Möglichkeit haben, einzelne Datei-Downloads abzubrechen, ohne dass der Thread beendet wird. Die Execute Methode der Threads sieht in etwa so aus:
Delphi-Quellcode:
procedure TDownloadThread.Execute;
begin
while (
not terminated)
do
try
NoJobsLeft := false;
Synchronize(GetAJob);
If NoJobsLeft
then break;
FAbortFile := false;
DownloadFile; <=== nächste Abort-Möglichkeit im OnWork von IdHTTP
except
{unbehandelte Exception}
end;
end;
procedure TDownloadThread.OnWork(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
var i: Integer;
begin
If (Terminated
OR FAbortFile)
then
begin
HTTP.Disconnect;
raise EAbort.Create('
Download aborted');
end;
end;
Die Downloads werden in einer Listview (vsReport) dargestellt, per Rechtsklick öffnet sich ein Popup-Menü, in dem man u.a. den Abbruch wählen kann. Nun zum eigentlichen Problem
. Für die Zeit, in der das Popup-Menü offen ist, müssen die selektierten Threads pausiert werden (=> TThread.Suspend). Soweit kein Problem.
Der User wählt "Download abbrechen", die FAbortFile-Variable wird auf true gesetzt, die Threads fortgesetzt (TThread.Resume) und das Popup-Menü geschlossen.
Und dann knallts... alle möglichen Fehlermeldungen klappen auf, von Zugriffsverletzungen über ungültige Zeigeroperationen bis hin zu ner "Priviligierten Anweisung". Hab auch schon versucht, alles in CriticalSections zu packen, hat aber auch nichts geändert.
Ohne Suspend und anschließenden Resume funktionierts.
Darf man auf die Eigenschaften eines Suspended Threads nicht schreibend zugreifen?
Gruß,
Dani
Edit:
Kommando zurück, ohne Suspend kommen die Zugriffsverletzungen auch. Vielleicht gibts ein Problem mit dem Zugriff auf TListItem.Data (wo eine Referenz auf den zugehörigen Thread gespeichert ist. Mal schauen...
Dani H.
At Least I Can Say I Tried