Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Rekursiver Funktionsaufruf

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
19.05.2004, 19:00 Uhr
~Randy
Gast


Hi,
ich rufe alle 5 Sekunden eine Funktion rekursiv auf, die mir lediglich alle Prozesse im TManager durchsucht und halt schaut ob ein bestimmter noch läuft.
Warum wird die Auslastung im Arbeitsspeicher dadurch erhöht, oder anders gefragt wo habe ich da ein Speicherleck.
Die Funktion wird erstmalig im Konstruktor aufgerufen.

Hier mal mein Code:


C++:
void MyClass::GetProcHandle(CString proc_name)
{
    hSysSnapshot = NULL;
    act_proc = NULL;

    proc1.dwSize = sizeof(proc1);
  
    //holen des Handles auf die momentanen Systemprozesse
    hSysSnapshot = CreateToolhelp32Snapshot ( TH32CS_SNAPPROCESS, 0 );


    Process32First(hSysSnapshot,&proc1);
    proc1.dwSize = sizeof(proc1);
    
    //act_proc_name = proc1.szExeFile;

     do
     {
        act_proc_name = proc1.szExeFile;
        if(proc_name.Compare(act_proc_name) == 0)
        {
            pid      = proc1.th32ProcessID;
            act_proc = OpenProcess(PROCESS_ALL_ACCESS,TRUE,pid);
        }
    }while(Process32Next(hSysSnapshot,&proc1));

     if(pid == 0)//DBLogic läuft nicht
     {
         WinExec("DBLogic.exe",1);
     }
     ::Sleep(1000);
     GetProcHandle("DBLogic.exe");

}



Ach ja, die Definitionen habe ich global gemacht.
Vielleicht kann mir jemand helfen, wäre echt klasse !

Randy
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.05.2004, 19:14 Uhr
~Randy
Gast


Noch eine Anmerkung:
Die if-Abfrage war fehlerhaft:


C++:
if(proc_name.Compare(act_proc_name) == 0)
{
pid      = proc1.th32ProcessID;//brauchts so nicht sondern:
pid = 1;                               //z.B.

//act_proc = OpenProcess(PROCESS_ALL_ACCESS,TRUE,pid);
// brauchts gar nicht, weil wenn er läuft muss man ihn nicht öffnen

}




Jedoch scheint das auch nichts zu bringen ...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
20.05.2004, 12:04 Uhr
Spacelord
Hoffnungsloser Fall


Wenn du die Methode rekursiv aufrufst wird jedesmal neuer Speicherplatz auf dem Stack belegt.Die Methode die du im Konstruktor aufrufst kehrt nicht zurück(und gibt somit auch kein Speicherplatz frei) sondern wartet auf den rekursiven Aufruf.Dieser kehrt aber auch nicht zurück weil der auch wartet usw. usw.
Sofern die Methode im "Hauptthread" deiner Anwendung läuft dürftest du damit auch deine Anwendung komplett lahmlegen!?.
Anstelle des rekursiven Aufrufs solltest du einen Timer anlegen und auf das Timerevent mit deiner Methode reagieren.

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
20.05.2004, 16:54 Uhr
~Randy
Gast


Vielen Dank für die Erklärung !

Randy
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
21.05.2004, 09:53 Uhr
~Randy
Gast


Hi, ich hab jetzt die Sache mit einem Timer angelegt, jedoch scheint hier
dieses Speicherleck trotzdem noch zu bestehen.
Charakteristisch ist hier, daß zunächst die Auslagerungsdatei ganz langsam ansteigt, so MB weise und dann plötzlich um 10 MB größer wird.

Vieleicht kann sich nochmal wer um meine Problematik annehmen ?

Danke, Randy
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
21.05.2004, 12:15 Uhr
Spacelord
Hoffnungsloser Fall


Wie sieht denn dein aktueller Code aus?

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
22.05.2004, 08:48 Uhr
~Randy
Gast


Des Rätsels Lösung:
Man muss das Handle auf den Snapshot vor dem erneuten Aufruf schließen, sonst hat man nach jedem Funktionsaufruf ein Handle im Speicher rumliegen und genau das hat ihn zugemüllt !


C++:
    CloseHandle(hSysSnapshot);




Randy
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: