ExtractIcon <- Ressourcenbelastend?



  • Hi,
    Ich bin gerade dabei eine neue Engine für mein Proggy zu schreiben.
    Ich hab mal folgende Frage:

    bool Iconsuchen;
    void __fastcall Suche::Suchen (AnsiString Datei)
    {
      Iconsuchen = true;
      int IconPos=0;
      while (Iconsuchen)
      {
         HICON IHandle = ExtractIcon(HInstance, Datei.c_str(),IconPos);
    
         if (IHandle != 0 && (int)IHandle != 0)
         {
            //Application->ProcessMessages();
            IconPos++;
         }
         else
         {
         Iconsuchen = false;
         DestroyIcon(IHandle); // Geht auch net besser
         }
      }
    }
    

    Wenn ich diese Funktion sehr oft ausführe, wird mein Programm immer instabiler(obwohl es in nem Thread liegt) und irgendwann steht dann "Leinwand erlaubt kein zeichen".

    Ist die Methode nicht sauber? Soll Ich ExtractIconEx benutzen? Oder was kann ich am besten machen?

    Ich bin auf die Ideee mit den ressourcen gekommen, da das Prog im Taskmanager wenige CPU Auslastung hat (6-30%) und die Speicherbelastung bei 3 mb (normal) liegt.



  • Aus der WinSDK Doku:

    WinSDK Doku Autor schrieb:

    Return Values

    If the function succeeds, the return value is the handle to an icon. If the file specified was not an executable file, DLL, or icon file, the return is 1. If no icons were found in the file, the return value is NULL.

    Diesen wichtigen Satz den ich fett markiert habe, hast du wohl übersehen?

    Tillmann David schrieb:

    Wenn ich diese Funktion sehr oft ausführe, wird mein Programm immer instabiler(obwohl es in nem Thread liegt)

    Was willst du damit sagen? Wieso sollte die Applikation stabiler sein, nur weil dieser code in nem Thread liegt?

    Tillmann David schrieb:

    Ist die Methode nicht sauber?

    Etwas anmassend, da du kaum der einzige bist, der diese Funktion verwendet...

    Tillmann David schrieb:

    Oder was kann ich am besten machen?

    Die Doku der Funktion am besser durchlesen? (o;

    -junix



  • junix schrieb:

    Was willst du damit sagen? Wieso sollte die Applikation stabiler sein, nur weil dieser code in nem Thread liegt?

    Ich weiß doch nicht, woran es genau liegt, eine Antwort hast du mir auchnicht gegeben.

    junix schrieb:

    Etwas anmassend, da du kaum der einzige bist, der diese Funktion verwendet...

    Das ist mir auch klar, nur vielleicht wird die Funktion nicht bei jedem 90 000 mal aufgerufen. 🙂
    Ausserdem kann es ja sein, das ich in meiner funktion einen denkfehler habe, zB ein Handel nicht gelöscht oder sonst was.

    junix schrieb:

    Die Doku der Funktion am besser durchlesen? (o;

    Danke, aber das habe ich getan, ich will aber aus allen dateien die Icons hohlen nicht nur aus den Dll oder applicationen.



  • das ist DestroyIcon ist an der Stelle sinnlos wo du es jetzt hast. da ist das handle ja ungültig.



  • iin schrieb:

    das ist DestroyIcon ist an der Stelle sinnlos wo du es jetzt hast. da ist das handle ja ungültig.

    Stimmt, dass hab ich auch nur in meiner Not probiert. 🙂
    Es will einfach net gehen. 😞



  • dann setz es doch an die richtige Stelle.

    Das Icon muss laut Doku mit DestroyIcon freigegeben werden.



  • stimmt ist doch kein wunder das das progy irgendwann absakt
    du holst ein handle mit
    HICON IHandle = ExtractIcon(HInstance, Datei.c_str(),IconPos);
    und gibt es doch nicht wieder frei
    DestroyIcon(IHandle);
    muss in die if anweisung und net ins else teil



  • Hat geklappt, thx!


Anmelden zum Antworten