Speicherfrage...



  • Hallo,

    ich habe ein Problem mit dem Speicher. Mein Programm läuft perfekt, da dort jedoch ein Thread( _beginthread ) benutzt wird habe ich bevor das Programm beendet wird eine Endlosschleife platziert. Schließe ich nun mein Konsolenfenster gibt es eine Fehlermeldung die eindeuting von meiner "Log-Klasse" kommt die als Singleton implentiert ist stammt. Und zwar wird der Dekonstruktor von der Log-Klasse aufgerufen jedoch scheitert der Befehl zum Schreiben in die Datei a la "Log Ende", bevor die Datei geschlossen wird. Auch wird der Dekonstruktur einer anderen Klasse in der die Endlosschleife platziert ist nicht mehr aufgerufen... Es wird also einiges an Speicher nicht mehr freigegeben. Wie kann ich dies beheben? Ohne meine Endlosschleife funktioniert es. Allerding brauche ich die Endlosschleife später wirklich um einen ununtebrrochenen Datenaustatusch zu ermöglichen. Trotzdem sollte sich das Programm auch wieder fehlerfrei beenden lassen...

    Würde mich über Hilfe sehr freuen 🙂

    Viele grüße und danke im Voraus



  • mach die endlosschleife nicht endlos

    statt

    while(true)
    

    kannst du schreiben

    while(!g_EndRequest);//volatile bool g_EndRequest=false;
    

    und in deinem main-thread bringst du halt die anfrage

    g_EndRequest=true;
    while(g_ThreadCount>0);//volatile int g_ThreadCount=0
    


  • rapso schrieb:

    mach die endlosschleife nicht endlos

    statt

    while(true)
    

    kannst du schreiben

    while(!g_EndRequest);//volatile bool g_EndRequest=false;
    

    und in deinem main-thread bringst du halt die anfrage

    g_EndRequest=true;
    while(g_ThreadCount>0);//volatile int g_ThreadCount=0
    

    Danke für deine Antwort, allerdings scheint mir das etwas hässlich zu sein... Also ich habe genau einen Thread der im Konstruktor, wo die Endlosschleife liegt gestartet wird. Gibt es denn keine Möglichkeit über die Winapi Funktionen eine Abfrage zu machen? Ich arbeite jedenfalls unter Windows XP und auch nur unter Windows muss dies Programm laufen. Danke im Voraus



  • imho ist es haesslich sprachferne konstrukte zu verwenden um endlosschleifen zu killen, zumal sie dann nichtmal sauber terminieren koennen z.b. destruktoren aller lokalen variablen aufrufen. du weisst dann ja auch nichtmal WO der thread gerade ist der zertoert wird, er koennte gerade ein handle auf eine datei haben in die er schreibt oder sonstige resourcen die nicht freigegeben werden.

    mein pseudocode ist nur ein simples beispiel wie ein thread auf sein terminate signal wartet (in etwa so wie die mainschleife bei den meisten winapi programmen). eine sehr uebliche art und weise threads sauber zu beenden (bzw sich beenden zu lassen).



  • Ich habe halt nur ein Problem mit der Umsetzung des ganzens. Ich habe eine Thread-Klasse geschrieben und von dieser erbe ich. Das ist nun der besagte Thread. Die Klasse wird im Konstruktor einer anderen Klasse mit new angelegt und später im Dtor wieder mit delete gelöscht. Außerdem ist inder Init Funktion dann die besagte Endlosschleife damit das Programm sich nicht bevor der Thread was macht beendet. Meine Frage: Wie mache ich das nun? Noch ist die Schleife nur da damit sich das Programm nicht beendet, aber das wird später anders sein...



  • Ich habe mir das übrigens so gedacht

    while ( IRGENDEINE_WINDOWS_FUNKTION_DIE_MIR_HILFT() )
     // Et voila...
    


  • BraucheHilfe schrieb:

    Ich habe halt nur ein Problem mit der Umsetzung des ganzens. Ich habe eine Thread-Klasse geschrieben und von dieser erbe ich. Das ist nun der besagte Thread. Die Klasse wird im Konstruktor einer anderen Klasse mit new angelegt und später im Dtor wieder mit delete gelöscht.

    dann hast du nen pointer drauf, ruf einfach ne funktion auf die eine member setzt dass sich der endlos-schleifen-thread beenden soll.

    alternativ

    while ( DEINE_FUNKTION_DIE_MIR_HILFT_WEIL_SIE_DIR_ZURUECKLIEFERT_DASS_SICH_DER_THREAD_BEENDEN_SOLL() )...



  • Irgendwie hab ich so meine Probleme.

    Also ich habe eine Klasse Messages( erbt von Thread ) und eine Klasse System

    In der Klasse System wird ein Objekt von Message angelegt und der Thread wird durch den Konstruktor von Messages gestartet.

    Log::~Log
    {
      AddToLog( "Programm Ende!" );   // Hier scheint das Programm abzustürzen! Ohne diese Zeile, lässt sich das Programm fehlerfrei beenden auch MIT meiner Endlosschleife. Die Klasse ist übrigens als Singleton implentiert...
      if ( LogFile ) LogFile.close();
    }
    
    // ##################
    
    Messages::Run( void ) // Dies ist die eigentliche "MessageLoop"
    {
      while ( true )
      {
        HandleMessages();
        Sleep(1);
      }
    }
    
    // ##################
    
    System::System( void )
    {
      Msgs = new Messages;
    }
    
    System::~System( void )
    {
     if ( Msgs ) delete Msgs;
    }
    
    System::Init( void )
    {
       while ( true ); // Das ist meine Endlosschleife, damit sich das Programm nicht ohne den Thread zu starten beendet. Ich muss ja testen... Außerdem wird diese Schleife später auch RICHTIG eingesetzt
    }
    

    Was mache ich falsch? Brauche echt eure Hilfe. Irgendwie zerreist es das Programm wegen einer dämmlichen Zeile, die aber irgendwie für das Lofgile notwendig ist 😞



  • Push! Ist mir sehr wichtig...


Anmelden zum Antworten