![]() |
Aktualisieren von Icons, wo ist der Fehler?
Ich muss in meinem Programm relativ häufig das TNA_Icon und ein entspr. Bild auf de Programmoberfläche aktualisieren. Die entspr. Icons habe ich in Resourcen und weise diese einer globalen TNA_Icon Variablen zu. Zwar steigt der Speicherverbrauch nur langsam, aber nach 2-3 Stunden mit ca. 10'000 Aktualisierungen bekommt das Programm Probleme seine Controls korrekt zu zeichnen, bzw. es reagiert auf überhaupt nichts mehr...
Wenn ich den entspr. Codeabschnit deaktiviere, dann läuft alles stabil
Delphi-Quellcode:
var
TNA_Icon: TIcon //globale Icon Variable sI: string //Name des verwendeten Icons ... { TNA-Icon } try RS := TResourceStream.Create(0, sI, RT_RCDATA); RS.Position := 0; oldIcon := TNA_Icon.ReleaseHandle; if oldIcon <> 0 then DestroyIcon(TNA_Icon.Handle); TNA_Icon.LoadFromStream(RS); {DestroyIcon(IconData.hIcon);} IconData.hIcon := TNA_Icon.Handle; Image1.Picture.Icon.Handle := TNA_Icon.Handle; finally RS.Free; end; ... |
Re: Aktualisieren von Icons, wo ist der Fehler?
also ich kenn mich mit der TNA nicht wirklich aus.
du machst ja "TNA_Icon.ReleaseHandle" . ich denke mal, dass das sowas wie .Free ist, oder? und später machst du "TNA_Icon.LoadFromStream(RS)". wenn meine vermutung stimmt, dann gibt es TNA_Icon ja gar nicht mehr zu diesem zeitpunkt, oder? hoffe ich hab kein müll gelabert ;-) gruss, iaby |
Re: Aktualisieren von Icons, wo ist der Fehler?
Zitat:
Das Problem ist allerdings, dass das alte Icon wohl doch nicht 100% weg ist, da dem Programm irgendwann die Resourcen ausgehen... |
Re: Aktualisieren von Icons, wo ist der Fehler?
Aber mann kann doch die Resourcen auch wieder im Speicher freigeben, oder irre ich mich da, kenn mich jetzt nicht so damit aus, aber mein, dass mal irgendwo gehört zu haben.
|
Re: Aktualisieren von Icons, wo ist der Fehler?
Genau das ist es ja, was mir offensichtlich nicht gelingt... :roll: :wall:
Ganz davon abgesehen habe ich auch noch nie einen wirklich funktionierenden Code dafür gesehen... es wird fast immer das DestroyIcon vergessen, das merkt nur keiner wenn man nicht gerade mal eben 10'000 mal das Icon wechseln will... dann crasht es nämlich :? |
Re: Aktualisieren von Icons, wo ist der Fehler?
Wenn ich das richtig verstehe dann brauchst du das doch gar nicht so :wink:
Icon ist (global) vorhanden, also wird nur das Bild getauscht. Icon.LoadFromStream macht das Nötige: altes Bild freigeben, neues Bild erzeugen. Release ist da schon kostenlos mit drinne. :mrgreen: Diesen Code habe ich mal durch den MemProof gejagt:
Delphi-Quellcode:
Ergebnis: Keine Resourcenverschwendung zu erkennen. :)
procedure TForm1.Button1Click(Sender: TObject);
var sI: string; RS: TResourceStream; i: integer; begin cl:= false; for i := 0 to 20000 do begin if sI = 'I1' then sI:= 'I2' else sI:= 'I1'; RS := TResourceStream.Create(0, sI, RT_RCDATA); try RS.Position := 0; Application.Icon.LoadFromStream(RS); Image1.Picture.Icon.Handle := Application.Icon.Handle; Label1.Caption:= IntToStr(i); Application.ProcessMessages; finally RS.Free; end; end; end; Was bedeuted "IconData.hIcon := TNA_Icon.Handle;" bei dir? Udo |
Re: Aktualisieren von Icons, wo ist der Fehler?
Mit "IconData.hIcon := TNA_Icon.Handle;" weise ich der TNotyfiyIcon-Struktur das Handle meines globalen Icons zu. Das globale Icon benötige ich nur, um dieses mit dem ResourceStream zu befüllen, da das nicht anders machbar war...
Memproof hatte ich auch schon drauf angesetzt... mit dem gleichen Ergebnis. Fakt ist aber, wenn ich diesen Code auskommentiere, läuft das Programm problemlos. Es ist ja nicht so, dass der Arbeitsspeicher unendlich befüllt würde, aber irgendwie gehen Windows nach 10'000 Neuzuweisungen die Resourcen aus :roll: ... Zitat:
|
Re: Aktualisieren von Icons, wo ist der Fehler?
Hmm, ich werde das mal heute Nacht durchlaufen lassen. :stupid:
Zitat:
-MemoryStream erzeugen -Ressource lesen -NewImage (Übergabe neuer stream) Neues bild erzeugen, Daten rein Altes Bild plattmachen (mit DestroyIcon) Ein DestroyIcon, so wie du es aufrufst liefert übrigens FALSE und GetLastError sagt dazu: 6....(setzen?) :mrgreen: (Weiss jetzt nicht was Error 6 bedeutet) Edit: Fehler 6 = Ungültiges Handle. Klar, nach Release... Hatte Windoof nicht schon immer seine Problemchen mit Icons? Udo |
Re: Aktualisieren von Icons, wo ist der Fehler?
Also ich hab das jetzt abgebrochen.
In ca. 10 Stunden problemlos 633.687.982 mal Icons getauscht. :shock: (XP Prof, SP1, 250MB) Keine Ahnung was du da treibst. :?: Udo |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:36 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