Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Aktualisieren von Icons, wo ist der Fehler? (https://www.delphipraxis.net/22800-aktualisieren-von-icons-wo-ist-der-fehler.html)

FriFra 24. Mai 2004 07:42


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;

...

iaby 24. Mai 2004 10:16

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

FriFra 24. Mai 2004 12:56

Re: Aktualisieren von Icons, wo ist der Fehler?
 
Zitat:

Zitat von iaby
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

Deien Vermutung stimmt nicht... ReleaseHandle gibt lediglich das Handle des zugewiesenen Icons frei. Mit DestroyIcon wird es dann endgültig "platt gemacht"...
Das Problem ist allerdings, dass das alte Icon wohl doch nicht 100% weg ist, da dem Programm irgendwann die Resourcen ausgehen...

Thorben86 24. Mai 2004 13:37

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.

FriFra 24. Mai 2004 13:43

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 :?

Udo 24. Mai 2004 16:10

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:
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;
Ergebnis: Keine Resourcenverschwendung zu erkennen. :)
Was bedeuted "IconData.hIcon := TNA_Icon.Handle;" bei dir?

Udo

FriFra 24. Mai 2004 16:42

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:

Zitat von Udo
Release ist da schon kostenlos mit drinne. :mrgreen:

Das habe ich auch mal geglaubt... es ist aber ein Irrtum. Leider gehen Windows ohne ein Release sehr viel schneller die Lichter aus als mit... ohne Relesae/DestroyIcon kann Windows nach einiger Zeit kein einziges Control irgendeines laufenden Programmes mehr sauber zeichnen... Da laufen dann plötzlich Word-Texte an der Seite aus MS-Word heraus, Listviews gehen unten über die Grenzen des Fensters frei über den Desktop etc... das habe ich auf verschiedenen Rechnern unter Win98SE, NT und XP getestet... Win98 ist dabei zwar am schnellsten und XP am spätesten am ende, aber Ausknocken kann man sie damit alle ;)

Udo 24. Mai 2004 18:02

Re: Aktualisieren von Icons, wo ist der Fehler?
 
Hmm, ich werde das mal heute Nacht durchlaufen lassen. :stupid:

Zitat:

...Release...
Das habe ich auch mal geglaubt... es ist aber ein Irrtum...
Doch, ist schon so. Binde mal die VCL-Sourcen mit ein. Da kannst du LoadFromStream schön verfolgen.
-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

Udo 25. Mai 2004 12:35

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