AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Aktualisieren von Icons, wo ist der Fehler?
Thema durchsuchen
Ansicht
Themen-Optionen

Aktualisieren von Icons, wo ist der Fehler?

Ein Thema von FriFra · begonnen am 24. Mai 2004 · letzter Beitrag vom 25. Mai 2004
Antwort Antwort
Benutzerbild von FriFra
FriFra

Registriert seit: 19. Apr 2003
1.291 Beiträge
 
Delphi 2005 Professional
 
#1

Aktualisieren von Icons, wo ist der Fehler?

  Alt 24. Mai 2004, 08:42
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;

...
Elektronische Bauelemente funktionieren mit Rauch. Kommt der Rauch raus, geht das Bauteil nicht mehr.
  Mit Zitat antworten Zitat
iaby

Registriert seit: 30. Nov 2002
Ort: BW
258 Beiträge
 
#2

Re: Aktualisieren von Icons, wo ist der Fehler?

  Alt 24. Mai 2004, 11:16
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
  Mit Zitat antworten Zitat
Benutzerbild von FriFra
FriFra

Registriert seit: 19. Apr 2003
1.291 Beiträge
 
Delphi 2005 Professional
 
#3

Re: Aktualisieren von Icons, wo ist der Fehler?

  Alt 24. Mai 2004, 13:56
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...
Elektronische Bauelemente funktionieren mit Rauch. Kommt der Rauch raus, geht das Bauteil nicht mehr.
  Mit Zitat antworten Zitat
Thorben86

Registriert seit: 20. Nov 2003
Ort: Brühl
365 Beiträge
 
Delphi 2005 Personal
 
#4

Re: Aktualisieren von Icons, wo ist der Fehler?

  Alt 24. Mai 2004, 14:37
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.
  Mit Zitat antworten Zitat
Benutzerbild von FriFra
FriFra

Registriert seit: 19. Apr 2003
1.291 Beiträge
 
Delphi 2005 Professional
 
#5

Re: Aktualisieren von Icons, wo ist der Fehler?

  Alt 24. Mai 2004, 14:43
Genau das ist es ja, was mir offensichtlich nicht gelingt...

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
Elektronische Bauelemente funktionieren mit Rauch. Kommt der Rauch raus, geht das Bauteil nicht mehr.
  Mit Zitat antworten Zitat
Udo

Registriert seit: 19. Jan 2003
54 Beiträge
 
Delphi 8 Architect
 
#6

Re: Aktualisieren von Icons, wo ist der Fehler?

  Alt 24. Mai 2004, 17:10
Wenn ich das richtig verstehe dann brauchst du das doch gar nicht so
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.

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 = 'I1then sI:= 'I2else 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
  Mit Zitat antworten Zitat
Benutzerbild von FriFra
FriFra

Registriert seit: 19. Apr 2003
1.291 Beiträge
 
Delphi 2005 Professional
 
#7

Re: Aktualisieren von Icons, wo ist der Fehler?

  Alt 24. Mai 2004, 17:42
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 ...


Zitat von Udo:
Release ist da schon kostenlos mit drinne.
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
Elektronische Bauelemente funktionieren mit Rauch. Kommt der Rauch raus, geht das Bauteil nicht mehr.
  Mit Zitat antworten Zitat
Udo

Registriert seit: 19. Jan 2003
54 Beiträge
 
Delphi 8 Architect
 
#8

Re: Aktualisieren von Icons, wo ist der Fehler?

  Alt 24. Mai 2004, 19:02
Hmm, ich werde das mal heute Nacht durchlaufen lassen.

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?)
(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
  Mit Zitat antworten Zitat
Udo

Registriert seit: 19. Jan 2003
54 Beiträge
 
Delphi 8 Architect
 
#9

Re: Aktualisieren von Icons, wo ist der Fehler?

  Alt 25. Mai 2004, 13:35
Also ich hab das jetzt abgebrochen.
In ca. 10 Stunden problemlos 633.687.982 mal Icons getauscht.
(XP Prof, SP1, 250MB)
Keine Ahnung was du da treibst.

Udo
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:56 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