[Thread] Deadlock verhindern
Hi!
Mit diesem Code setze ich einen Thread auf suspended:
Delphi-Quellcode:
Nun treten sporadisch ab und zu Deadlocks auf. Der ThumbnailThread hat an 2 oder 3 Stellen Synchronize-Aufrufe. Ich vermute der Deadlock tritt auf, wenn der Thread gerade Synchonize(Main-Methode) ausführt, die main-Methode aber auf suspended wartet. Zumindest kreise ich in der Delay-Schleife wenn mal wieder nichts geht. Gibt es da spezielle Techniken wie man an das Problem herangehen kann?
procedure TImgStdListView.SuspendThread;
begin if FThumbnailThread.Suspended then Exit else begin FThumbnailThread.RefreshNow(nil); while not FThumbnailThread.Suspended do Delay(300); end; end; Grüße Sebastian |
Re: [Thread] Deadlock verhindern
Hallo,
normalerweise würde man sowas mit dem Konzept des gegenseitiger Ausschlusses machen - das dürfte aber hier nicht funktionieren durch die Architektur des "VCL-Threads". Warum mußt du denn warten bis der Thread wirklich suspended ist? Du könntest probieren ein Application.ProcessMessages in die Schleife einzubauen, allerdings ist das nicht die feine Art mit einem Delay - denn da blockierst du auch die Oberfläche deines Programmes (kein Neuzeichnen etc.). |
Re: [Thread] Deadlock verhindern
Zitat:
Ich muss warte, da der Thread Thumbnails generiert und dabei natürlich auf das Dateisystem zugreift. Viele Änderungen und Aktionen des Users erzeugen dann natürlich Zugriffsverletzungen, wenn der Thread nicht eingeschläfert wird, wenn er gerade generiert. Der Delay ist wirklich nicht optimal. Man bräuchte einen Befehl der die Rechenzeit an die Threads abgibt. Hast du eine Idee? |
Re: [Thread] Deadlock verhindern
Hallo,
na dann brauchst du aber auch keinen extra Thread. Wozu Nebenläufigkeit wenn der eine Thread die ganze Zeit delayed ist :mrgreen: Ich weiß ja nicht genau wie dein Programm arbeitet, kann ich mir das so vorstellen das du eine Übersicht hast wofür die ganzen Thumbnails generiert werden? Dann würde ich die Thumbnails im Formular alle auf nil (oder irgendwie deaktiviert) setzen und der Thread ruft dann eine Callback-Funktion auf die Thumbnail für Thumbnail auf einen Bild setzt und das neuzeichnen veranläßt. Solange ein Thumbnail noch nil ist kann es halt nicht gezeichnet werden. |
Re: [Thread] Deadlock verhindern
Zitat:
Zitat:
|
Re: [Thread] Deadlock verhindern
Zitat:
|
Re: [Thread] Deadlock verhindern
Ja genau, an einigen Stellen wird der Thread suspended. Zum Beispiel wenn Dateien in den gerade angezeigten Ordner kopiert/gelöscht/verschoben werden, Drag&Drop usw.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:31 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