Schleifenproblem bzw. Message-Queue ausgebootet



  • Ich habe ein Schleifenproblem !
    Und zwar will ich kontinuierlich Daten von einem an den PC angeschlossenen Bus-System abfragen und ausgeben. Mein Plan ist, dass ich die Abfrage über einen Button starte und dann solange laufen lass, bis ein Abbrechen-Button gedrückt wird - also ungefähr so:

    bool stop = false;
    
    ...
    
    case WM_COMMAND:                                                              
    
              if (LOWORD(wParam) == 1)
              {
                 while (stop == false)
                 {
                    // Daten von CAN-BUS abfragen und ausgeben
                 }
              }
              if (LOWORD(wParam) == 2) 
              {
                 stop = true;
              }
    

    da das so aber bis jetzt leider nicht funktioniert hat (Absturz!), hab ich hier schonmal bisschen im Forum rumgeschaut und die Aussage gefunden, dass während der Schleifenausführung meine Message-Warteschlange brach liegt und das Programm logischerweise nicht mehr reagiert (zweite if-Anweisung wird nie ausgeführt).

    Als Lösung könnte man entweder in regelmäßigen Abständen unterbrechen und die anliegenden Nachrichten abarbeiten - oder man startet einen eigenen Thread!

    Das mit dem Multi-Threading erscheint mir recht kompliziert (und zeitaufwändig zu erlernen), deswegen meine Frage:
    wie kann ich denn (meine Schleife) in regelmäßigen Abständen unterbrechen ??

    oder gehts womöglich doch irgendwie mit meiner Idee ?
    Danke für Hilfe !!



  • Das mit dem Multithreading ist überhaupt nicht kompliziert.



  • Das mit dem Multithreading ist überhaupt nicht kompliziert.

    naja es kann kompliziert werden aber in deinem fall tut es das wohl kaum.

    du koenntest es zb so anstellen das du einen thread erstellst der den can-bus ausliest, die relevanten nachrichten in eine queue schreibt und dann schaut ob er aufhoeren soll und sonst halt wieder von vorne anfaengt.

    in deiner windows nachrichten-bearbeitungs-routine kannst du dann zb per timer dir immer eine nachricht schicken lassen (vielleicht jede sekunde) und dann die queue abarbeitest.

    du musst dann aber aufpassen das nicht deine windows schleife und dein thread gleichzeitig auf die queue zugreifen. Das geht indem du eine CriticalSection um die aufrufe der queue packst.

    also kA was ein canbus is aber so koennte man es zb anstellen.
    es gibt bestimmt noch bessere bin jetz aber zufaul nachzuschauen was ein canbus genau is aber ich denke du verstehst jetz wie man sowas angehen kann mit mltithreading


  • Mod

    Wenn die Ein- und Ausgaben nicht hoch frequent sind, dann kanst Du auch einen simplen Timer verwenden.



  • Martin Richter schrieb:

    Wenn die Ein- und Ausgaben nicht hoch frequent sind, dann kanst Du auch einen simplen Timer verwenden.

    wie? bitte ? was ist den 'hoch frequent' ?
    mal so btw.



  • hä? schrieb:

    was ist den 'hoch frequent' ?

    100 ms



  • Sorry, dass ich mich nicht mehr gemeldet habe - ich muss in meinem Programm mittlerweile keine "Dauer-Abfrage" mehr machen.
    Deswegen hat sich das Thema im Prinzip erübrigt ...

    Trotzdem Danke für Hilfe .....
    Gruß an alle Coder


Anmelden zum Antworten