EditFeld nach UpdateData sofort aktualisieren



  • hi
    habe einen kleinen dialog mit einem edit-feld und einen button

    void CUpdatetestDlg::OnStart() 
    {
        for(int i=0;i<100000;i++)
        {
            m_counter=i;        
            UpdateData(FALSE);
        }   
    }
    

    das wird aufgerufen wenn ich auf den button drücke, m_counter ist die variable für das edit-feld (vom typ long).
    wenn ich das programm starte und dann auf den start-button klick passiert folgendes:
    es steht am anfang 0 drinnen und nach 2 sekunden 99999

    was muss ich machen damit innerhalb der 2 sekunden angezeigt wird, das der counter immer um 1 erhöht wird ????
    🙂

    EDIT:
    Titel geändert.
    - dEUs

    [ Dieser Beitrag wurde am 23.08.2002 um 11:47 Uhr von dEUs editiert. ]



  • Hallo, soweit ich weiß, hängt die Nachrichtenverarbeitung deiner Applikation bei so einer Schleife fest, d.h. dein edit-Feld wird nicht aktualisiert. Abhilfe schafft hier ein Timer, der den counter hochzählt und sich dann bei erreichen des Ziels selber wieder killt.

    Gruß mathi



  • Hallo!

    Es geht auch anders!

    Einfach diese Funktion in der Schleife ab und zu aufrufen:
    --------------------------------------------------------

    void CWipeFreeDlg::DoEvents()   // Evtl. Anstehende Events ausführen
    { 
        MSG msg;                    // Message Variable
    
        // Process existing messages in the application's message queue. 
        // When the queue is empty, do clean up and return. 
        while (PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)) {    // Solange Messages vorhanden
    
            if (!AfxGetThread()->PumpMessage()) return;      // Kein plan...  :-)
        } 
    }
    

    --------------------------------------------------------

    Und könnte das bitte Jemand unter einer vernunftigen Überschrift in den FAQ's plazieren? Das interresiert bestimmt einige...

    Ciao!



  • cool funktioniert

    thx für die schnellen antworten !



  • Hallo nochmal,

    Also mit dem Timer hole ich bei meinem Test gerade mal ca. 150 Werte in 2s herraus.

    @PanicMan: Deine Version ist deutlich schneller. Ist auch irgendwie eleganter - hab mal wieder was dazu gelernt.

    Gruß mathi



  • Jo!

    Tja, habe ich selbst vor ein paar Monaten hier in dem Forum erfahren... 🙂

    So und jetzt heißt es sein wissen weitergeben...

    Ciao!



  • Hallo !

    Noch eine Möglichkeit:

    CString text;
    
    for(int i=0;i<100000;i++)
    {
    //  m_counter=i;        
    //  UpdateData(FALSE);  // wenn es auch ohne UpdateData sein darf...
    
        text.Format("%i", i);                   // keine Lust, eine Editfeldmembervariable anzulegen
        SetDlgItemText(IDC_EDIT1, text);        // keine Lust, eine Editfeldmembervariable anzulegen
        GetDlgItem(IDC_EDIT1)->RedrawWindow();   // Editfeld neu zeichnen
    }
    

    Ohne eine "Bremse" sieht man aber nur ein Flimmern in dem Eingabefeld... 😃

    Tschüss


Anmelden zum Antworten