Messages block durch Sleep?



  • Hallo,

    ich habe ein Editfeld und einen Knopf.

    Wenn ich auf den Knopf drücke soll in das Edit-Feld ein Text rein und das Programm soll etwa 1500 ms warten bis es weiter geht.

    Code:

    m_strEdi = "Jippi";
        UpdateData(FALSE);
        // oder
            SetDlgItemText(IDC_EDIT1, "Hallo");
        Sleep(1500);
    

    ihr seht er setzt den Text (mit UpdateData oder mit SetDlgItemText) und soll dann 1500 ms warten.
    Doch es kommt anders, es hat den Anschein ob er 1500 ms wartet und dann denn Text setzt.
    Wenn man nun

    SetDlgItemText(IDC_EDIT1, "Hallo");
    AfxMessageBox("sd");
        Sleep(1500);
    

    macht wird der text auch gesetzt bevor er 1500 ms wartet.

    **Wahrscheinlich hängt er in der MessageSchleife durch das Sleep würde ich mal tippen.

    Weiß jemand wie ich das Problem beheben kann???**



  • mm an der Message-Schleife kann es nicht hacken

    MSG message;
    
        SetDlgItemText(IDC_EDIT1, "Hallo Nasi");
    
        if (::PeekMessage(&message, NULL, 0, 0, PM_REMOVE)) {
                ::TranslateMessage(&message);
                ::DispatchMessage(&message);
            }
    
    Sleep(1500);
    

    funkts genauso wenig 😕

    Weiß jemand wie ich das anders machen kann? also nicht mit Sleep aber mit gleichem Efekt (Ne schleife mit einem hochen Zähler tuts auch nicht).



  • Dein Programm braucht auch etwas Zeit um den Text zu setzen ?
    Das Sleep wird aufgerufen bevor das System an dem Text was ändern kann ?



  • Knuddlbaer Dein Programm braucht auch etwas Zeit um den Text zu setzen ?
    Das Sleep wird aufgerufen bevor das System an dem Text was ändern kann ?

    Es braucht Zeit??? ja wieviel denn??
    Das Programm ist ja nicht groß und macht nur das was ich gepostet habe.

    Wenn das wirklich stimmt wie kann ich das ohne Sleep lösen??



  • Wenn nur der Button in dieser Zeit nicht aktiv sein soll dann deaktiviere ihn und mit einem Timer wieder aktivieren. Sonst sehe ich keinen Sinn das du ein Sleep einbaust da hier die ganze Messageschlange nicht verarbeitet werden kann.
    Dh. dein Programm reagiert auch auf ein neuzeichnen durch überlagerung eines anderen Fensters nicht.



  • ok passt auf.

    Mein Program
    EditFeld - Button.

    wenn nun der Knopf gedrückt wurde überprüfe ich ob der Inhalt des Editfeldes der ist der richtig war.

    Wenn dies aber nicht der Fall und nur 1 Zeichen Falsch war soll er dies in dieser Form hinschreiben:

    Eingabe: hilfe
    Richtig: Hilfe
    So soll der Text 1500 ms Sekunden im TextFeld stehen: "H"ilfe
    damit der Benutzer sieht was er Falsch gemacht hat.

    nach den 1500 ms wird der nächste Datensatz abgefragt und daher nach denn 1500 ms das Textfeld gelehrt.

    Wie kann ich das am besten realisieren, wenn es nicht mit meiner obrigen Lösung geht???



  • SetDlgItemText(IDC_EDIT1, "Hallo");
    GetDlgItem(IDC_EDIT1)->UpdateWindow();
    Sleep(1500);
    


  • @RenéG dicken dank funkts alles so wie ich will.

    Weißt du vieleicht warum das so war wie es war???



  • Sicher, bissel muss man Windows schon verstehen, wenn man es programmieren will!

    SetDlgItemText setzt die Daten des internen Datenspeichers und ruft Invalidate auf, das Display wird aber erst aufgefrischt, wenn WM_PAINT geschickt wird. Und das ist der Fall bei UpdateWindow, oder, wenn Windows Zeit hat, die Anzeige aufzufrischen, dann schickt es automatisch eine WM_PAINT-Nachricht. Durch Sleep allerdings wird die Messageverarbeitung angehalten, d.h. in der MessageQueue steht WM_PAINT und wartet darauf, das Sleep endlich vorbei ist!


Anmelden zum Antworten