Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Threads THreadList und lesen/schreiben (https://www.delphipraxis.net/157589-threads-threadlist-und-lesen-schreiben.html)

Memnarch 17. Jan 2011 17:45

Threads THreadList und lesen/schreiben
 
NAbend,
Ich zermatter mir mal wieder den Kopf mit dne Threads.

Folgendes:

Ich habe eine TThread list, in dieser liste wird eine anzahl von X bildern vorgebuffered, und wnen benötigt ausgelesen.

Der Hauptthread will einfach nur die benötigten bilder auslesen. Der Thread der sich um den Buffer kümmert, guckt immer bei welchem bild der Hauptthread gerade ist, und wnen die distanz zum bifferende zu klein wird, werden wieder x bilder nachgeladen.

Das problem ist, das zwar alle bilder reingeladen, aber nicht mehr ausgelesen werden können, es gibt keine fehlermeldung, nur nen leeres Layered Window. Zu allem überfluss scheint es nichtmal möglich abzufragen, ob die Liste noch gelockt ist.
Kann mir jemand helfen? Ich habe Threads noch NIE wirklich hinbekommen, wne ein Thread schreibt und der andere ausließt.

Code:
procedure TMemoryManager.Execute;
var
  i: Integer;
  LPContainer: TPicContainer;
  LBitmap: TBitmap;
  LList: TList;
begin
  inherited;
  Self.FPos := 0;
  GPicList := TThreadList.Create;
  GPicList.Duplicates := dupAccept;
  GLock := False;
  LLIst := GPicList.LockList;
  for i := 0 to 5478 - 1 do
  begin
    LPContainer := TPicContainer.Create;
    LPContainer.FBitmap := TBitmap.Create;
    LList.Add(LPContainer);
  end;
  GPicList.UnlockList;
  while( not Self.Terminated) do
  begin
    if(Self.FPos - GAnimPos < 5)then
    begin
      for i := 0 to 50 - 1 do
      begin
        LList := GPicList.LockList;
        try
          LPContainer := TPicContainer(LList.Items[Self.FPos]);
          LPContainer.FBitmap.SetSize(Screen.Width, Screen.Height);
          LoadIdToImage(Self.FPos, LPContainer.FBitmap);
          Self.FPos := Self.FPos + 1;
        finally
          GPicLIst.UnlockList;
        end;
      end;
    end
    else
    begin
      sleep(20);
    end;
  end;
end;
un die bild funktion:

Code:
procedure LoadFastIdToImage(AId: Integer; ABitmap: TBitmap);
var
  LList: TLIst;
begin
  LList := GPicList.LockList;
  try
    ABitmap.Assign(TPicContainer(LList.Items[AId]).FBitmap);
  finally
    GPicList.UnlockList;
  end;
end;

himitsu 17. Jan 2011 18:47

AW: Threads THreadList und lesen/schreiben
 
Du kannst übrigns auch .Add direkt aufrufen, ohne jedesmal selber zu sperren ( .LockList ).

LockList und andere Sperrende Methoden sperren solange den Zugrif, bis es wieder freigegeben wird. Weitere LockList und Add in anderen Threads werden dann also angehalten.


PS: Anstatt ständig über den Lade-Thread die Liste zu prüfen, würde ich im Arbeits-Thread ein Event werfen, welches dem Callback sagt, daß man bald keine Daten mehr hat.

Und statt einer Liste würde ich hierfür eher einen Queue verwenden.

Memnarch 17. Jan 2011 21:25

AW: Threads THreadList und lesen/schreiben
 
MH, okay, werde ich mir nochmal angucken und wie eine Queue aufgebaut ist^^"

EDIT: so habs nun hinbekommen. Das problem lag daran, das de rlade thread immer orentlich puffern sollte und GLEICHZEITIG die Bilder auf die bildschirmgröße hochrechnen sollte. Letzteres führte zum stau. Also wird das Hochrechnen nun wieder vom HAuptthread gemacht, was dafür sorgt das alle in Butter ist, und der Ladethread auchmal ne pause einlegt wens mal wneiger zu laden gibt :)(und der speicherverbrauch ist geringer^^). Das prog läuft nun auf "schnuckeligen" 44%im durchschnitt. Schonmal stabiler ;)

Damit gebe ich dan wieder an diesen Thread Ab(performantes hochrechnen der bilder ist damit die letzte Hürde): http://www.delphipraxis.net/157568-s...er-bilder.html


MFG
Memnarch


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:00 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