Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Threads: Eingeschaften von suspended Threads schreiben? (https://www.delphipraxis.net/39956-threads-eingeschaften-von-suspended-threads-schreiben.html)

Dani 9. Feb 2005 13:47


Threads: Eingeschaften von suspended Threads schreiben?
 
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 :roll:. 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 9. Feb 2005 22:19

Re: Threads: Eingeschaften von suspended Threads schreiben?
 
Lustig, hab gerade sämtlichen Code, der mit Thread-Zugriffen zu tun hat, auskommentiert. Die Fehler bleiben. Shoot me. Könnte sich ein Mod erbarmen und den Thread bitte löschen :( ? *schäm*

Edit: Der Fehler hat seltsamerweise etwas mit der Freigabe einer stinknormalen TList zu tun...
Edit#2: Aha, das Formuar versucht anscheinend beim schließen die bereits freigegebene TList nochmal freizugeben. Mit FreeAndNil funktionierts wunderbar. Very Strange.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:46 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz