Endlosschleife durch Button unterbrechen..



  • Hallo.

    ich habe noch eine Frage bzw. ein Problem.

    Ich habe ein Maske. Dort betätige ich einen Button, der mir eine Übertragung vom Sensor liefert. Die Funktion für die Daten befindet sich hinter der der Abfrage des Buttons, also im Ereignis "OnButtonclk".

    Nun möchte ich, dass er mir ständig Daten zusendet. Jedoch wenn ich ein Button drücke, diese Übermittlung unterbrochen wird. Wollte dies mit einer Endlosschleife machen. Und dann wenn ich den anderen Button "Übertragung beenden" mir die Funktion aufhört daten zu senden. Habe dies versucht, dass ich eine "bool" variable mir anlege, wo ich wenn die Übertragung erfolgreich war, diese auf 1 gesetzt wird.

    jedoch kann ich überhaupt nicht mehr auf den anderen button drücken, wenn s sich hierbei um eine endlos schleife handelt.

    wie könnte ich dieses Problem beheben??



  • Nimm einen Timer.



  • kannst du mir auch sagen, wie das gehen kann??



  • Der Start-Button legt mit SetTimer() einen Timer an, der anschließend laufen lassen wird, der Stop-Button killt diesen Timer wieder - und in jedem Aufruf der OnTimer-Verarbeitung lässt du genau ein Datenpaket empfangen.

    Alternativ dazu kannst du beim Start auch einen neuen Thread loslaufen lassen und auf eine Variable oder Event überprüfen, die vom Stop-Button gesetzt wird.



  • also ich starte einen timer, der solange läuft wie mir ein datenpacket zugesendet wird. anschließend wenn ich keinen button gedrückt habe, wird erneut der timer gestartet.

    er läuft solange, bis ich den anderen button gedrückt habe. wie kann ich dies denn so programmieren??

    [code]void "Klasse"::OnbtnClk()
    {
    Thread = new Thread();
    }

    und dann??
    ich gucke mir mal durch, ob ich sonst noch was finde über threads.



  • irgendwie hast du nicht richtig gelesen.

    Nutz einen Timer ODER einen Thread. Wobei der Timer wohl einfach ist. Kommt drauf an, in welchem Abstand du die Daten aben willst.

    Im Prinzip (Timer):

    OnBtnClk()
    {
    SetTimer(<TIMER_RESOURCE>, <Zeit>);
    }
    
    OnTimer(....)
    {
    //Hauptcode wärend der Timer läuft. Wiederholt sich, biss Timer oder Prog beendet wird
    }
    
    OnBtnClkStop()
    {
    KillTimer(<TIMER_REYOURCE>);
    }
    


  • also, ich möchte die daten so schnell wie möglich übermitteln..geht das, dass ich sozusagen alle 2ms meine daten bekomme??

    in meiner funktion OnBtnClk(), wo ich meine abfolge für die daten habe, erstelle ich nur den timer und dann springe ich in die funktion OnTimer(..) und packe dann dort meine funktion, die zum empfangen der daten zuständig ist.

    anschließend ist das so, wenn ich den anderen button OnBtnClkStop() drücke, wird mir der timer "gelöscht". stimmt das soweit??

    nur mein problem ist: wenn ich mir hier angucke. ich erstelle einen timer mit bestimmter zeit, die er mir abläuft. wenn der timer dann nach 1.mal beendet ist hört er mir doch auf, meine daten zu empfangen oder nicht??oder läuft er dann von vorne??

    ich möchte wie schon beschrieben: dauerempfang meiner daten und sozusagen zwischendurch eine überprüfung,ob der OnBtnClkStop() gedrückt wurde. falls ja, aufhören zu empfangen. ist mit den vorschlägen hier diese funktion realisierbar??



  • Der Timer läuft so lange, bis du ihn wieder killst - und startet dir alle n Millisekunden die OnTimer()-Methode.


  • Mod

    Aber nur, wenn auch eine Nachrichtenschleife läuft... 🙂



  • Martin Richter schrieb:

    Aber nur, wenn auch eine Nachrichtenschleife läuft... 🙂

    Stimmt. Aber solange du dich nicht stundenlang in einem Message-Handler festhängst, sollte das nicht das Problem darstellen. Ein Nachteil bei dem Timer-Ansatz dürfte sein, daß du auf einen vorgegebenen Rhythmus festgelegt bist.

    PS: Nur falls es dich interessiert, der Ansatz mit Threads:

    CEvent m_stop;//in der Dialog-Klassse
    
    void CMyDlg::OnButtonStart()
    {
      afxBeginThread(th_func,this);
    }
    
    UINT CMyDlg::th_func(LPVOID me)//static Methode
    {
      CMyDlg* pThis = (CMyDlg*)me;
      while(WaitForSingleObject(pThis->m_stop,0)==WAIT_TIMEOUT)
      {
        //empfange und verarbeite einen Datensatz
      }
      return 0;
    }
    
    void CMyDlg::OnButtonStop()
    {
      m_stop.SetEvent();
    }
    

    (hierbei mußt du allerdings bedenken, daß fremde Threads nicht auf die Ansicht zugreifen dürfen - sprich: die Thread-Funktion darf keine Control-Variablen des Dialogs anfassen und auch nicht UpdateData() und dergleichen aufrufen)



  • also, für mich denke ich würde sich die timer- methode dann empfehlen..einfach beim drücken des buttons laufen lassen und immer wieder wiederholen und dann beim drücken des anderen buttons, den timer killen..gibts eigentlich irgendwelche pdf´s oder so zum thema "timer"??



  • was ich noch fragen wollte: was gebe ich unter <TIMER_RESSOURCE> und <Zeit> ein bzw. wie??



  • schau mal in der MSDN nach, oder google nach "SetTimer()". Da sollte was zu finden sein.



  • TIMER_RESSOURCE - eine beliebige ID, die du später wiedererkennen mußt
    Zeit - die Laufzeit des Timers im Millisekunden



  • kann ich eigentlich in der Methode OnTimer eine Funktion aufrufen??oder muss ich den Code dort reinpacken..??


  • Mod

    Klar kannst Du! Warum solltest Du das nicht können? Was denkst Du denn was passiert wenn eine Funktion aufgerufen wird?


Anmelden zum Antworten