UpdateData und Schleifen



  • Hallo,
    wieso funktioniert das nicht

    for (i=1; i<10000; i++) {
    		m_Out = i;
    		UpdateData(FALSE);
    }
    

    was basiert, nur der letzte wert wird ausgegeben....
    weiß vielleicht jemand wieso?!?
    danke
    Harald



  • Servus,

    was isn m_Out für ein Typ und worauf bezieht er sich, auf einen CEdit???

    *winke*
    Hellsgore



  • klar hab ich vergessen,
    hab eine dialogfeld bassierte anwendung gemacht,
    einem formularfeld habe ich eine public membervariable mit dem namen m_Out vom typ int gegeben.

    jetzt hätte ich gerne dass man in diesem formularfeld den wert i hochzählen sieht.

    sehen tut man allerdings nur den endwert (also 9999)
    komisch oder?
    hat das was mit gültigkeit von variablen innerhalb von schleifen zu tun?
    wieso sehe ich dann am ende der schleife den 9999?
    ist die schleife zu schnell für UpdateData?
    danke schonmal



  • Ich habe nicht mehr viel Zeit deshalb nur kurz:

    1. Du solltest dir dafür am besten einen Timer bauen Info-> Hier in FAQ / Forum
    2. Dann den Wert anhand des Timer hochzählen lassen und ihn ins Feld setzen

    *winke*
    Hellsgore



  • nur damit ich nicht dumm sterben muss 🙂
    timer deshalb weil der vorgang zu schnell ist? (für updatedata)

    ok habs gefunden danke!



  • In UpdateData wird eine WM_PAINT-MESSAGE gesendet um den Bildschirmanzeige zu aktualisieren . Da aber solange deine Schleife läuft keine neuen Nachrichten bearbeitet werden können, wird die Anzeige erst aktualisiert wenn Du am Ende Deiner Schleife angekommen bist.



  • habs hingekriegt,
    also noch mal,
    vielen dank 😃



  • naja bracuht man echt einen timer dafuer?

    geht es nicht mit sleep(1000) ( in der schleife ) zum bsp. ???

    muesste doch auch gehen oder?



  • ok djohn hat recht mit der message

    man braucht einen timer



  • Servus,

    brauchst nicht unbedingt einen Timer. Kannste auch anders machen. Nur Timer deswegen weil du dann einstellen kannst, wie schnell er hochzählen soll. Ein Sleep() ist ganz schlecht dann passiert nämlich garnicht für diesen gewissen Zeitraum.

    Pass auf ein kleines Beispiel von mir:

    in .h

    public:
    afx_msg void OnTimer(UINT_PTR nIDEvent);
    int iGlobalCounter;
    

    in .cpp

    const short ID_TIMER1 = 1;
    
    BEGIN_MESSAGE_MAP(CDeinDlg, CDialog)
        ON_WM_TIMER()
    END_MESSAGE_MAP()
    
    .
    .
    .
    
    void CDeinDlg::DeineFunk()
    {
      iGlobalCounter = 0;
      SetTimer(ID_TIMER1, 1000, NULL);
    }
    
    void CDeinDlg::OnTimer(UINT_PTR nIDEvent)
    {
       if (nIDEvent == ID_TIMER1)
       {
          if (iGlobalCounter == 1000)
              KillTimer(ID_TIMER1);
    
          CString strEdit;
          strEdit.Format("%d", i);
          m_ctrDeinEdit.SetWindowText(strEdit);
          i++;
       }
    }
    

    Das wäre z.B. eine Möglichkeit das er jede Sekunde bis 1000 hochzählt und das in einem Edit ausgibt oder du baust einen Thread (AfxBeginThread in MSDN gucken) oder du leitest während einer Schleife die Messages durch:

    in .h

    public:
    void PumpMessages();
    

    in .cpp

    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::DeineSchleife()
    {
       CString strEdit;
       for (int i = 0; i<= 1000; i++)
       {
          PumpMessages();
          strEdit.Format("%d", i);
          m_ctrDeinEdit.SetWindowText(strEdit);
       }
    }
    
    //oder du nimmst statt SetWindowText halt deine CString Membervar mit nem UpdateData(). funzt auch
    

    Viel Spass
    *winke*
    Hellsgore



  • WOW COOL

    ein fall fuer die faq

    da hier timer und peeks erklaert werden an einem simplen bsp

    👍



  • newkid schrieb:

    WOW COOL

    ein fall fuer die faq

    da hier timer und peeks erklaert werden an einem simplen bsp

    👍

    http://www.c-plusplus.net/forum/viewtopic.php?t=39085


Anmelden zum Antworten