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 weiterleiten

    Wir 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*
    Hellsgore

    EDIT:
    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_TIMER

    Erstelle 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 mehr

    in 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.


Anmelden zum Antworten