EditFeld nach UpdateData sofort aktualisieren
-
hi
habe einen kleinen dialog mit einem edit-feld und einen buttonvoid 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 99999was 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