![]() |
[AnfängerFrage] Einsatz für CriticalSections?
Hallo zusammen...
erstens... wurde vor wenigen Tagen etwas am Forum geändert, denn ich habe zur Zeit massive Probleme, das Forum anzusehen oder Posts zu lesen, also sorry, falls meine Frage schon beantwortet wurde, aber die Suche funktioniert (zumindest für mich) zur Zeit nicht. zweitens: mein Problem ich gebe eine Reihe von URLs in eie stringlist ein (oder droppe sie genauer gesagt vom Browser aus in das Memo-Feld, hinter welchem ein StringList steht). Der Analyze-Thread wertet den ersten Eintrag aus dieser StringListe aus und schreibt diesen danach abwechselnd in die ObjectListen zweier Download-Threads (nach dem mod 2 = 0 Prinzip) und löscht den ersten Eintrag der StringList. Die DownloadThread lesen den ersten Eintrag aus ihrer Objectlist aus, downloaden die datei, die durch diesen Eintrag (im Grunde eine weitere URL) referenziert wird und löschen den ersten Eintrag aus ihrer Liste. Sowohl AnalyzeThread als auch die beiden DownloadThreads laufen seit Programmstart Also (verkürzt) etwa so: "Hauptprogramm"
Delphi-Quellcode:
AnalyzeThread:
procedure fmDropZone.Drop[...]
[...] AnalyzeThread.FSL.Append(URL); [...]
Delphi-Quellcode:
wobei OL1 / OL2 die ObjectListen der DownloadThreads sind und FSL die StringListe, aus der der AnalyzeThread liest.
while not terminated do
begin [...] if (FIdentCount mod 2 = 0) then begin OL1.Add(TFlickr.Create); OL1.Last.Analyze(FSL.Strings[0], FIdentCount); end else begin OL2.Add(TFlickr.Create); OL2.Last.Analyze(FSL.Strings[0], FIdentCount); end; Inc(FIdentCount); FSL.Delete[0]; Synchronize(UpdateDisplay); [...] end; end; DownloadThread:
Delphi-Quellcode:
Nach langer Vorrede jetzt meine Frage: Das riecht für mich nach CriticalSections an zwei Orten:
while not Terminated do
begin if FOL.Count > 0 then begin Flickr := FOL.Items[0]; [...] if UrlDownloadToFile(nil, PChar(Flickr.FImageURL), PChar(Path + Flickr.FImageFileName), 0, nil) = S_OK then begin FOL.Delete(0); Synchronize(UpdateDisplay); end; end; [...] end; :arrow: Da, wo ich dem AnalyzeThread aus dem Hauptprogramm etwas in die StringList FSL schreibe und ich im AnalyzeThread daraus lese und einen Eintrag lösche :arrow: Da, wo ich im AnalyzeThread in die ObjectLists OL1 & OL2 der DownloadThread schreibe und in den DownloadThreads daraus lese und einen Eintrag lösche Habe ich das so richtig verstanden? Wäre für alle Antworten (außer den vollkommen unproduktiven) dankbar |
Re: [AnfängerFrage] Einsatz für CriticalSections?
HI,
die Critical Sections sollten so stimmen. Als Faustregel, würde ich sagen, gilt: Dort wo du Threadübergreifende Befehle ausführst, solltest du CriticalSections einführen. Den Rest mit dem Analysieren sollte zur Geschwindigkeitsverbesserung nicht in der CS stehen. Bernhard |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:08 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