Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi [AnfängerFrage] Einsatz für CriticalSections? (https://www.delphipraxis.net/121120-%5Banfaengerfrage%5D-einsatz-fuer-criticalsections.html)

silver-moon-2000 22. Sep 2008 18:09


[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:
procedure fmDropZone.Drop[...]
[...]
  AnalyzeThread.FSL.Append(URL);
[...]
AnalyzeThread:
Delphi-Quellcode:
  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;
wobei OL1 / OL2 die ObjectListen der DownloadThreads sind und FSL die StringListe, aus der der AnalyzeThread liest.

DownloadThread:
Delphi-Quellcode:
  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;
Nach langer Vorrede jetzt meine Frage: Das riecht für mich nach CriticalSections an zwei Orten:

: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

rollstuhlfahrer 22. Sep 2008 21:24

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 18:59 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