CList Probleme



  • Hallo Leute,

    hab mal wieder ein kleines Problem:
    in einer Applikation habe ich eine 'Queue' aus CStrings durch eine CList verwirklicht.

    Hintergrund:
    ich erhalte in meinem Programm von div. Netzwerkverbindungen nachrichten, die dann an das Ende der Queue angefügt werden.
    Die Queue wird dann von einem Thread abgearbeitet und die Strings in ein EditView geschrieben.
    Im Prinzip ein einfaches logging-tool 😉

    Seit letzter Woche habe ich ein Problem:
    Wenn Daten sehr schnell eingehen und an die Queue angefügt werden, dann erhalte ich in meiner Release-Version zu unterschiedlichen Zeitpunkten eine Exception.
    Durch div. Debugger-Verränkungen bin ich auf die CList gekommen (Methode NewNode)

    Hatte hier schon mal jemand gleiche oder ähnliche Probleme mit clist?
    Hat jemand vielleicht einen alternativ Vorschlag für mein Logging?

    Vielen Dank und schönen Abend.



  • Vermutlich verwendest Du keine Synchronisation um den Zugriff auf die Liste abzusichern, oder?
    Du musst ein CCriticalSection verwenden, wenn Du auf die Liste zugreifen willst!



  • Vielen Dank. Ich denke, dass das helfen sollte.

    Ich hätte da aber noch eine Frage zur Funktionalität:
    Ich habe in meiner Klasse result für die Steuerung der Liste und die Ausgabe eine Methode Append.
    Diese erhält einen String, ruft queue.AddTail( String ) auf und setzt ein Event.
    Der Thread zur Verarbeitung wartet auf das Event und begint nun die Liste abzuarbeiten.
    Wenn in der Zwischenzeit neue Strings hinzugefügt wurden, dann werden diese gleich in einem 'Rutsch' abgearbeitet.

    Wie sieht das aber jetzt mit der CriticalSection aus?

    Ich würde beim Anfügen eines neuen Elements die Section locken, anfügen, freigeben und event setzen.
    Soweit richtig?
    Bedeutet das aber auch, dass ich im Thread nicht einfach so auf die Liste zugreifen kann bzw. sollte?

    Ich glaube, ich werde morgen die Doku dazu genauer durchlesen.



  • Mit der CS musst Du es so machen (Pseudo-Code):

    Reinstopfen:

    m_CS.Enter();
    m_queue.PushBack(...);
    m_CS.Leave();
    m_Event.Set();
    

    Rausholen:

    while(1)
    {
      m_Event.WairFor();
      Entres *entryList;
      m_CS.Enter();
      entryList =  m_queue.getAll();
      m_CS.Leave();
    
      // Process entryList...
    }
    


  • Vielen Dank.

    Hab das ganze schon eingebaut und funktioniert super.

    Allerdings habe ich heute morgen meine alte Version nochmals getestet - die Bedingungen waren wie gestern, allerdings heute ohne exception 😕

    Aber mit der CriticalSection läuft das ganze.

    Nochmals vielen Dank.



  • SledgeIT schrieb:

    Allerdings habe ich heute morgen meine alte Version nochmals getestet - die Bedingungen waren wie gestern, allerdings heute ohne exception 😕

    Die Probleme werden nur vermehrt auf einem Multi-Prozessor-System (oder Hyperthreading-System seltener) auftreten...

    => Neuen Rechner kaufen 😉


Anmelden zum Antworten