alternative zu Sleep()



  • hi Leute,

    wollte mal fragen, ob jemand eine alternative zu der Sleep() Funktion kennt. Denn ich benutze Sleep() in einer Schleife. In dieser wird aber auch ein Ladebalken hoch gesetzt. Das macht er aber wegen dem Sleep() nicht mehr. Das Sleep() brauche ich, weil ich zu einem anderen Server mappe. Und da muss etwas zeit abgewartet werden, bis die Verbindung steht.

    MFG SPAXX



  • Servus,

    ja Threads......

    Guck mal in der MSDN ist ein schönes Bsp. AfxBeginThread();

    //in .h
    static UINT DeinThread(LPVOID pParam);
    
    //in.cpp
    UINT CDeinDlg::DeinThread(LPVOID pParam)
    {
       //CDeineAusführklasse muss vom Typ
       //CWinThread sein
       //mach was
       //Da static musste ((CDeinDlg*)pParam)-> verwenden
    }
    
    void CDeinDlg::ButtonClick()
    {
        AfxBeginThread(DeinThread, this)
    }
    

    Das war mal ein Bsp. von mir hatte ich mir mal irgendwo festgehalten. Vielleicht hilft es dir weiter.

    Es gibt auch noch die Möglichkeit während sich dein Rechner in einer Schleife befindet, die ankommenden, erzeugten Msg weiter zu leiten:

    void CDeinDlg::PumpMessages()
    {
        ASSERT(GetSafeHwnd() != NULL);
        MSG msg;
    
        while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            if (!IsDialogMessage(&msg))
            {
                ::TranslateMessage(&msg);
                ::DispatchMessage(&msg);
            }
        }
    }
    

    und dann in deiner Schleife:

    while (KatzeKlo)
    {
     PumpMessages();
     MachWas();
    }
    

    Viel Spass
    *winke*
    Hellsgore



  • ich wollte das nicht extra mit Threads machen. Gibts da nichts einfacheres???



  • poste doch mal dein konkretes code stueck, dann kann man eher helfen



  • Du könntest doch den Sleep Befehl nachahmen 😉

    einfach ne Schleife mache die nix tut:

    for(long i=0; i<1000000; i++);
    

    Nachteil ist natülich das der Prozess volle Last hat, Du keine Chance hast das Teils zu unterbrechen und das das Teil auf jedem Rechner unterschiedlich lang braucht.
    Also unter dem Strich nicht zu empfehlen 😃



  • Nachteil numéro due: Das Ding wird vom Compiler wegoptimiert :p .



  • MaSTaH schrieb:

    Nachteil numéro due: Das Ding wird vom Compiler wegoptimiert :p .

    sehr gut aufgepasst.
    ausser der nimmt einen der nicht optimiert 😉

    aber ist auch dumme lösung



  • Also mal abgesehen davon, dass er das Programm dann nur noch auf seinem Rechner starten kann, wegen anderen Prozessorgeschwindigkeiten, ist das im Allgemeinen keine gute Lösung. Aber ich habe auch keine Lösung für das Problem ohne Threads...

    Wie ist das eigentlich, gibt es denn eine Alternative zu dem Sleep ( ), eine die in millisekunden zählt, wie das GNU-Linux sleep ( ms ). Sleep kann ja nur Sekunden zählen.



  • AlCheMy schrieb:

    Wie ist das eigentlich, gibt es denn eine Alternative zu dem Sleep ( ), eine die in millisekunden zählt, wie das GNU-Linux sleep ( ms ). Sleep kann ja nur Sekunden zählen.

    ne stimmt net sleep(1000) = 1 sec. d.h. sleep(1) ist was????????



  • sleep (1) ist dann 1/1000 sek. = 1 millisekunde (milli entspricht tausend)...



  • Hallo Leute,

    hab in Zusammenhang mit Sleep einen COM-Port tockeln lassen. Ein Sleep(1) (1ms!) dauert in minimum 8-9ms, also kannst Du einen Sleep kleiner als 8-9ms nie durchführen. Zumindest nicht in W2K und XP! 👎

    Gruß

    Chris



  • //in .h
    static UINT DeinThread(LPVOID pParam);
    
    //in.cpp
    UINT CDeinDlg::DeinThread(LPVOID pParam)
    {
       //CDeineAusführklasse muss vom Typ
       //CWinThread sein
       //mach was
       //Da static musste ((CDeinDlg*)pParam)-> verwenden
    }
    
    void CDeinDlg::ButtonClick()
    {
        AfxBeginThread(DeinThread, this)
    }
    

    Also ich möchte jetzt das doch mit Threads machen. Habe also die Methode angelegt. Und habe auch verstanden, das wenn ich die Funktion AfxBeginThread(DeinThread, this) aufrufe, das er dann in die Methode DeinThread() rein geht. Aber was hat das für einen Vorteil? Für mich sieht das so aus, als wenn das nur ne Methode ist. Oder irre ich mich da? Habe das Prinzip bzw. den Vorteil noch nicht verstanden. Helft mir

    MFG



  • Versuchs mal damit:

    void CTestDlg::SleepEx(CWnd *wnd, int Time)
    {
    	int start = GetTickCount();
    	while ((signed)GetTickCount() - start < Time)
    	{
    		MSG msg;
    		if (::PeekMessage(&msg,NULL,0,0,PM_REMOVE))
    		{
    			if (msg.message == WM_QUIT)
    			{
    				::PostQuitMessage(-1);
    			}
    
    			if (!wnd->PreTranslateMessage(&msg))
    			{
    				::TranslateMessage(&msg);
    				::DispatchMessage(&msg);
    			}
    		}
    	}
    
    }
    

    Aufruf mit SleepEx(this,2000);



  • vetti du bist ein alter ruler!!!! Weiß zwar nicht wie du das wieder hinbekommen hast, aber RESPECT!!! Denn nur du hast es drauf!!! Gruß an den burna. Kannst du mir auch bei den anderen sachen helfen??? Farbe von Button und hintergrundfarbe etc. Du rockst die Bude echt durch!!!

    MFG SPAXX



  • AlCheMy schrieb:

    sleep (1) ist dann 1/1000 sek. = 1 millisekunde (milli entspricht tausend)...

    ahmm, war eigentlich ne rhetorische frage, aber nichts fuer ungut fuer deine mathe nachhilfe

    jep sleep(1) geht net unter xp. sollte man eher machen ab sleep(25) oder so noch besser ( um sicher zu gehen ) sleep(50). xp ist halt kein abgespecktes realtime betriebssystem, oder ein optimierter microcontroller.



  • MaSTaH schrieb:

    Nachteil numéro due: Das Ding wird vom Compiler wegoptimiert :p .

    hmm ein kleiner nachtrag

    wenn er jetzt volatile als schluesselwort davor schreibt musst er es trozdem stur machen oder? oder optimiert ein compiler heutzutage sowas auch schon???


Anmelden zum Antworten