Edit-Feld nach 500 ms updaten
-
Hallo,
ich möchte in einem Edit-Feld eine Variable anzeigen lassen. Diese Variable wir in einer Schleife incrementiert. Damit man das auch am Bildschirm sieht, dachte ich, dass die Schleife bei jedem Durchlauf 500ms warten soll. Für die Zeit soll die aktualisierte Variable sichtbar sein. Wenn ich aber sleep einsetze dauert zwar die Abarbeitung der Schleife länger, aber der Wert wird nicht am Bildschirm angezeigt
Hier der Code der das realiseren soll
//Sendernamen und Frequnezen initialisieren int sendfreq[8]={902, 933, 945, 963, 977, 989, 1024, 1051}; CString sendnam[8]={"Bayern 2", "Energy", "Bayern 1", "Gong", "B5", "Bayern 3", "Antenne", "Klassik"}; int anzahl= sizeof(sendfreq)/sizeof(sendfreq[0]); //Variable für gefundene Senderstation int found=-1; do { freqcount++; Sleep(500); m_frequenz=(double)freqcount/10; UpdateData(FALSE); for (int i=0; i<=anzahl;i++) { if (freqcount==sendfreq[i]) { found=i; } } if(freqcount>1075) freqcount=877; }while (found==-1); m_sendername=sendnam[found]; UpdateData(FALSE);weiss jemand warum mein Edit-Feld nicht aktualisiert wird
-
in welcher funktion machst du das?
meiner meinung nach wird das Editfeld erst upgedatet, wenn die Funktion verlassen wird.Hab dein Prog mal ausprobiert und es funkt auch. dauert nur ziemlich lange bis die schleife durchlaufen ist, weil du jedesmal eine halbe Sekunde wartest
-
Servus,
ich kenne bei dem Prob 2 Möglichkeiten.
1. Im Thread laufen lassen
2. Die Msg weiterleitenWir nehmen mal die 2te Variante:
void CDeinDlg::PumpMessages() { ASSERT(GetSafeHwnd() != NULL); MSG msg; while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { if (!IsDialogMessage(&msg)) { ::TranslateMessage(&msg); ::DispatchMessage(&msg); } } } void CDeinDlg::ZiehderKatzeAmSchwanz() { //Sendernamen und Frequnezen initialisieren int sendfreq[8]={902, 933, 945, 963, 977, 989, 1024, 1051}; CString sendnam[8]={"Bayern 2", "Energy", "Bayern 1", "Gong", "B5", "Bayern 3", "Antenne", "Klassik"}; int anzahl= sizeof(sendfreq)/sizeof(sendfreq[0]); //Variable für gefundene Senderstation int found=-1; do { freqcount++; //Sleep(500); PumpMessages(); m_frequenz=(double)freqcount/10; UpdateData(FALSE); for (int i=0; i<=anzahl;i++) { if (freqcount==sendfreq[i]) { found=i; } } if(freqcount>1075) freqcount=877; }while (found==-1); m_sendername=sendnam[found]; UpdateData(FALSE); }Du rufst dann in der Schleife Pumpmessages auf und die Msg werden weitergeleitet bzw. weiterverarbeitet, danach läuft er ganz normal durch die Schleife weiter.
Trotzdem rate ich dir dich mal über Threads kundig zu machen. Kann dir später viel nützen: MSDN -> AfxBeginThread()
*winke*
HellsgoreEDIT:
Damit hat sich das dann auch erledigt -> http://www.c-plusplus.net/forum/viewtopic.php?t=76842

-
Hab grad nochmal nachgeschaut.
Du hast so was ähnliches doch schon mal gefragt.Mach dir einfach mit dem Klassenassistenten eine Controlvariable auf dein Editfeld (frequenz) und rufe dann dauernd m_Edit_frequenz.RedrawWindow() auf.
-
Hallo,
hat mit deinem eigentlichen Problem nichts zu tun:
Ich glaube es ist besser deine Frequenz und den Sendernamen in eine Struktur zu packen..struct struct_test { double frequenz; CString sendername; }; // Speicher anfordern struct_test *test = new struct_test; CPtrArray carr; carr.Add(test); // Speicher wieder freigeben for(int i = 0; i < carr.GetSize(); i++) { delete carr.GetAt(i); }Dann ist es auch leicht die Anzahl der Radiostationen zu ermitteln:
int anzahl = carr.GetSize();Nur ein Vorschlag, schaust mal..
MfG
-
Warum postest du doppelt.

Ich lösche mal den anderen.
Wenn du in einem Programm Sleep einbaust dann wird der Thread angehalten.
Sollte es sich dabei um den Hauptthread handeln reagiert dein Programm nicht auf eingaben da auch die Nachrichten warteschlange nicht abgearbeitet. Wird.3. Möglichkeiten:
Bauen eine Timer ein.
Nachricht: WM_TIMERErstelle einen Thread
Zeichen das Fenster nach dem Update neu.
UpdateWindows();Die 3te ist dabei die schlechtestet da dein Programm immer nooch nicht reagiert.
-
also ich sag nochmal
BAU EINEN TIMER ( bevor du noch 10 posts zum selben prob aufmachst! )
bau einen timer ( vorsicht wenig arbeit !! )
grob ueberblick wieviel arbeit das tatsaechlich ist
bei recourcen view
rechte maustaste -> rescoursen symblo dann namen geben ( z.b. ID_COUNT_TIMER )wenn du den timer aufrufen mochtest ( egal wo, z.b. oninit oder so )
SetTimer(ID_COUNT_TIMER,120,NULL); 120 = 120 ms ich nimm immer bissle mehrin der .cpp void xxxDlg::OnTimer(UINT nIDEvent) { if ( nIDEvent == ID_COUNT_TIMER) { hier den code rein was er machen soll ( halt deine ausgaben ) } // Call base class handler. //CMDIFrameWnd::OnTimer(nIDEvent); CDialog::OnTimer(nIDEvent); }in der message map ( auch cpp ) noch reinmachen
[/cpp]
BEGIN_MESSAGE_MAP(meindialogDlg, CDialog)
// deinen ganzen dinger halt und dann noch naechte zeile
ON_WM_TIMER()
END_MESSAGE_MAP()
[cpp]und wenn du timer nicht mehr brauchst dann
KillTimer(ID_COUNT_TIMER);
und wehe du versuchst es nochmal ohne timer und postet noch geiche frage paar mal

-
Hab leider doppelt gepostet, da ich bei meinem ersten Versuch keine Antwort vom Server mehr bekommen habe. Deswegen dachte ich, dass der Beitrag wohl irgendwie verschollen ist. Hab dann einfach das gleiche nochmal gepostet.
Sorry.