While Schleife durch Button abbrechen



  • Hallo,

    ich habe eine While Schleife die cih mit einem Button abbrechen möchte.
    Jetzt ist das Problem das so lange die Schleife läuft sich kein Button betätigen lässt.
    Wie kann man das lösen?



  • Mithilfe von Threads.
    Lagere die Schleife in eine Funktion aus, die du dann als zusätzlichen Thread startest.



  • Danke für den Tipp.
    Hat funktioniert.

    Leider hatte ich in meiner Schleife einen
    label dem bei jedem Schleifendurchgang ein neuer Wert zugewiesen wird.

    Hatte das so gelöst:

    while(1)
    {

    ......
    label1->Text=lesen1;
    label1->Refresh();

    }

    Der Thread aktualisiert leider meine labels nicht.
    Was mache ich da falsch?

    Habe die Schleife in eine Funktion ausgelagert und Rufe die Funktion dann im
    backgroundWorker1 auf.



  • Hi, habe für solche Dinger immer folgende Funktion eingesetzt:

    void PumpMessages(void)
    {
        MSG msg;
        while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    //---------------------------------------------------------------------------
    

    Um die Nachrichtenverarbeitung normal weiter arbeiten zu lassen.

    while(1)
    {
    
    ......
    label1->Text=lesen1;
    label1->Refresh();
    PumpMessages();
    }
    

    mfg



  • Das PumpMessage Ding ist doch genau der gleiche Mist wie DoEvents(). Siehe Diskussion hier und vor allem dieser Blog Eintrag.

    Die Variante mit extra Thread + Invoke bzw. BackgroundWorker ist definitiv besser. Aber Zitat aus der MSDN:

    You must be careful not to manipulate any user-interface objects in your DoWork event handler. Instead, communicate to the user interface through the ProgressChanged and RunWorkerCompleted events.

    Genau das versuchst du hier und funktioniert wie gesehen nicht. Besser finde ich eh Threads wo du mehr Möglichkeiten bei der Codegestaltung hast als beim BackgroundWorker. Dort musst halt den GUI Zugriff mit nem Control.Invoke erfolgen damit der Zugriff im GUI Thread läuft denn nur da sind GUI Zugriffe erlaubt, nicht in extra Threads.



  • Hallo,

    ich möchte gerne von Form1 und Form2 auf eine selbst erstellte Header zugereifen.
    Die Header enthält die 4 Grundrechenarten.
    Wenn ich die Header in Form1.h bekannt mache läuft das alles super.
    Nun möchte ich aber auch die 4 Grundrechenarten aus der Form2.h benutzen.
    Aber sobald ich sie da bekannt mache, bekomme ich die Fehlermeldung.

    Fehler 1 error LNK2005: "public: static double __clrcall _rechnen::_multiplikation(double,double)" (?_multiplikation@_rechnen@@$$FSMNNN@Z) ist bereits in Form2.obj definiert. Test.obj

    Wie und Wo kann ich die Header einbinden, damit ich sie aus der Form1 und Form2 benutzen kann?

    Danke für die Hilfe, Malle


Log in to reply