Einzelnen Beitrag anzeigen

Benutzerbild von Dani
Dani

Registriert seit: 19. Jan 2003
732 Beiträge
 
Turbo Delphi für Win32
 
#1

Threads: Eingeschaften von suspended Threads schreiben?

  Alt 9. Feb 2005, 14:47
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
  Mit Zitat antworten Zitat