Datenbank bei jedem Zugriff öffnen und schließen oder nur einmal öffnen


  • Mod

    Wenn Du mehrere Threads benutzt, dann ist das Pflicht!



  • Martin Richter schrieb:

    Wenn Du mehrere Threads benutzt, dann ist das Pflicht!

    Hi,

    ja ich benutze mehrere Threads, und hatte auch ab und zu einen undefinierten Absturz der exe mit einer Speicherzugriffsverletzung...

    Ich teste mal, vielen Dank.

    Beste Grüße

    BOA



  • Hallo Martin,

    wenn ich das wie Du angegeben hast in einen Message Queue Thread verpacke, wo diese while - Schleife immer läuft, solange das Programm läuft und schaut, ob ich eine neue Message zum Abarbeiten habe.

    Das belastet aber den Prozessor mit 100%....

    Kann ich nicht so etwas machen ?

    CSingleLock lock(&m_critical,TRUE);
    
    for(list<mes>::iterator itMes = m_listeMessages.begin(); itMes != m_listeMessages.end(); itMes++)
    {
    
    MessageReceive(itMes->message, itMes->sock);
    itMes = m_listeMessages.erase(itMes);
    itMes--;
    
    }
    

    Muß ich nicht eigentlich nach einem Lock ein Unlock machen ?

    Besten Dank und Grüße

    BOA


  • Mod

    Schau Dir mal bitte meinen Code an!
    Dein Code kan nicht funktionieren. Er nimmt die Liste in Beschlag und gibt sie nicht frei!
    Und ja. Du solltest ein Event haben, was diese Schleife nur bei Bedarf anstösst und ansonsten den Thread schlafen lässt!



  • Martin Richter schrieb:

    Schau Dir mal bitte meinen Code an!
    Dein Code kan nicht funktionieren. Er nimmt die Liste in Beschlag und gibt sie nicht frei!
    Und ja. Du solltest ein Event haben, was diese Schleife nur bei Bedarf anstösst und ansonsten den Thread schlafen lässt!

    Hi,

    mir fehlt irgendwie noch Background, aber ich finde auch nichts Vernünftiges im Net, was ich noch zusätzlich studieren könnte zu diesem Thema.

    Ich habe mir Deinen Code angeschaut, und verstehe eigentlich nur nicht, wo der Lock wieder freigegeben wird und woran ich erkenne, welches Objekt genau gelockt wird.

    Ich habe statt deinem Thread nen Timer genommen, was ja auch ein Thread ist ( glaube ich zumindestens, bitte um Korrektur, falls diese Annahme nicht stimmt ), und lasse dort die Schleife mit den Nachrichten durchlaufen.

    Das einzigste Problem, was ich bis dato habe, ist, dass es wahrscheinlich in einem sehr ungünstigen Fall, wenn ich gerade die Liste durchlaufe zu einem Hinzufügen an einer anderen Stelle kommt ( Ein User loggt sich ggf. gerade an einem Socket ein, ein anderer Timer wird gestartet, ... )

    Deswegen wollte ich Deine Lösung mit dem CSingleLock ( immer dort wo ich hinzufüge und bevor die Liste durchlaufen wird. siehe oben. ) ergänzen, dazu muss ich aber die Funktionalität genau begreifen, damit ich nicht noch mehr Schaden anrichte....

    Danke und Grüße

    BOA



  • Hallo Martin,

    ich glaube ich habe Deine geschweiften Klammern übersehen.
    Da wird das Objekt wieder freigegeben ? Ist das korrekt ?

    Ich habe meinen Code nun geändert ( Im Timer ) :

    CSingleLock lock(&m_CriticalSection);
    			lock.Lock();
    
    			CString ausgabe;
    			ausgabe.Format("%d Nachrichten in der Queue",m_listeMessages.size());
    
    			m_info2.SetWindowText(ausgabe);
    
    			for(list<mes>::iterator itMes = m_listeMessages.begin(); itMes != m_listeMessages.end(); itMes++)
    			{
    
    				MessageReceive(itMes->message, itMes->sock);
    				itMes = m_listeMessages.erase(itMes);
    				itMes--;
    
    			}
    
    			lock.Unlock();
    

    Zudem wird dann bei jedem Ergänzen der Liste folgender Code verwendet :

    CSingleLock lock(&m_CriticalSection);
    			lock.Lock();
    
    			mes tMes;
    			tMes.message = "0200";
    			tMes.sock = 0;
    
    			m_listeMessages.push_back(tMes);
    
    			lock.Unlock();
    

    Macht das Sinn ?

    Grüße

    BOA


  • Mod

    Meine Lösung ist insofern besser, weil beim Bearbeiten jedes Eintrages schon wieder Einträge in die Liste eingefügt werden können.
    Sind bei Dir 20 Einträge drin steht für die gesamte Bearbeitung auhc das einfügen in die Liste.

    Schau Dir noch mal genau meine Methode an.



  • Martin Richter schrieb:

    Meine Lösung ist insofern besser, weil beim Bearbeiten jedes Eintrages schon wieder Einträge in die Liste eingefügt werden können.
    Sind bei Dir 20 Einträge drin steht für die gesamte Bearbeitung auhc das einfügen in die Liste.

    Schau Dir noch mal genau meine Methode an.

    Ja, hi

    das macht natürlich Sinn, was Du schreibst.
    Das heißt aber, ich müsste den Thread ständig starten und in den Sleep Modus setzen. An welcher Stelle prüfe ich ab, ob ich ihn tatsächlich starten muss...
    Wahrscheinlich starte ich ihn prinzipiell, wenn ich etwas hineinpacke in die Liste, oder ?

    Wäre das aber prinzipiell richtig, was ich da treibe ?

    Besten Dank und Grüße

    BOA


  • Mod

    Richtig der Thread startet immer. Am Besten erzeugst Du ein Autoreset CEvent das gesetzt wird sobald etwas in die Liste reinkommt. Der Thread wartet auf dieses Event oder arauf, dass das Programm beendet...



  • Hi Martin,

    ich habe jetzt erst mal meine Variante mit der Schleife in der OnTimer umgesetzt und es scheint prima zu laufen. Ich habe keinen Absturz mehr, seitdem ich mit Locks arbeite...

    Deine Variante werde ich mal ausprobieren, wenn ich mal mehr Zeit zum ausgiebigen Testen habe.

    Danke und Grüße

    BOA


Anmelden zum Antworten