Buttonstatus



  • Hallo,

    ich mach derzeit eine Fortschrittsanzeige..über eine einfache for anweisung lass ich hochzählen .etc

    nun möchte ich das ganze durch einen "buttonklick" anhalten und hab mir gedacht das ich das mit do..while mache
    allerdings weiss ich nich wie ich den button status abfrage

    mal kurz

    do
    {
       for(i.....)
       {
       ....
       }
    }
    while("und hier soll quasi rein : wenn button gedrückt wird soll es nicht weiter hochzählen");
    


  • Wenn der Button gedrückt wird, schickt er normalerweise eine BN_CLICKED Nachricht - aber die wird erst abgearbeitet, wenn deine aktuelle Funktion fertig ist. Die beste Möglichkeit wäre es, die Berechnung in einen eigenen Thread auszulagern und in der OnButton()-Funktion die Abbruchbedingung zu setzen.

    (aber achte auf korrekte Synchronisation)



  • erstell dir ne membervariable vom typ bool (m_bTorF)
    weis der m_bTorF beim start deines Progs einen Wert zu (m_bTorF=TRUE;)
    weis dem Button eine Funktion zu in dieser schreibst du

    m_bTorF= !m_bTorF;//Ist variable True wird sie False bzw. umgekehrt

    dann hast du da einen Denkfehler da die do/while schleife aufhört zu zählen sobald du sie beendest. bzw ist deine Fortschrittsanzeige in der for schleife gefangen und die hört ja erst auf zu zählen wenn die einen bestimmten wert erreicht hat und das denke ich ist das ende der Fortschrittsanzeige. somit würde eigendlich wenn du die do/while nicht beendest die for schleife erneut starten & die Fortschrittsanzeige wieder von vorne beginnen.

    do
    {
        if(m_bTorF)//ist m_bTorF TRUE setze die Fortschrittsanzeige um eins weiter hoch
        {
            ....
        }
    
    }while(solange bis Fortschritsanzeige am ende ist);
    

    hier passiert nun folgendes die do/while schleife wiederholt sich solange bis ein bestimmter wert erreicht ist zB die Fortschrittsanzeige am ende ist. die Fortschrittsanzeige wird aber nur dann nach oben gesetzt wenn m_bTorF == TRUE ist. ist sie es nicht kommt auch die do/while schleife ihrem ende nicht näher 😉



  • ich poste ma hier den Quellcode der die Status Anzeige derzeit startet

    void CFort2Dlg::OnStart()
    {
    do
    {	
    for(int i=0; i<=100;i++)
        {
          for(int j=0; j<10000000;j++);
    
          m_ctlProgress.SetPos(i);
        }
    }
    while(a == 0);
    }
    
    void CFort2Dlg::OnStop() 
    {
    a=1;	
    }
    

    Wie zu sehn ist hab ich es mal versucht das wenn ich Stop klick a auf 1 gesetzt wird und solang a = 0 ist läuft es normal weiter ..aber so gehts nich^^



  • Die Nachrichtenschlange wird von oben nach unten abgearbeitet. Und solange die OnStart() nicht zurückgekehrt ist, wartet der Klick auf den Stop-Button geduldig in der Warteschlange. Als Lösung könntest du die Schleife in einen eigenen Thread auslagern, der von der OnStart() angestoßen wird und dann autonom weiterläuft.

    (oder du startest einen Timer und aktualisierst in jedem OnTimer() Aufruf den Fortschrittsanzeiger)


Anmelden zum Antworten