Timer im Hintergrund?



  • Danke für die schnelle Antwort 😉

    Aber gibt es da noch was einfacheres 😃



  • also mir fallen auf die schnelle nur die möglichkeiten SetTimer und Multithreading ein. du solltest es mal mit letzterem versuchen, is gar nich soo schwer 🙂 .
    in die threadFunc kommt das rein was dein timer tun soll, in z.17 was deine main funktion währenddesse tun soll, das wars schon.

    main und threadFunc arbeiten dann praktisch fast wie 2 prozesse parallel.

    zum Schluss wartet main mit WaitForSingleObject auf ThreadFunc bis diese fertig ist.



  • Du mußt mal nachschlagen, wenn ich das richtig in Erinnerung habe, muß für die Timer-Funktion (SetTimer) eine Message-Loop vorhanden sein.
    Allerdings ist auch das kein Problem, wenn Du die Thread-Funktion mit einer Message-Loop ausstattest, bleibt Deine main wie sie ist.



  • wenn man multithreading sowieso schon für settimer() braucht kann man sich das settimer() aber auch gleich sparen und in ThreadFunc die eigene timerfunktion packen.

    allerdings kommt es dabei darauf an wie genau der timer sein soll:

    wenn er ganz genau sein soll bleibt ihm wohl eh nichts anderes übrig als sich an der systemzeit zu orientoeren(was wohl tatsächlich am einfachsten mit SetTimer geht).

    wenn er nicht gaanz so genau sein muss würde ich das mit sleeps in der Thread Func lösen( verliert zwar ein gaanz kleines bisschen zeit, ist für normale programme über normale zeitraüme unerheblich).

    Er kommt also sowieso nicht um meine lösung mit multithreading herum, da sie für set timer auch benötigt wird. somit würde ich ihm eher das mit den Sleeps empfehlen (ist einfach einfacher 😃 )

    mfg,
    andi01.



  • andi01 schrieb:

    #include<stdio.h>//auch für multithreading benötigt
    

    Was spricht dagegen <cstdio> zu nehmen? stdio.h ist der C-Header.

    Davon abgesehen gibts in der doku zu boost::asio ein kleines Tutorial wo es sich um Timer u.ä. dreht. Das Ganze dann Plattformunabhängig.



  • natürlich kann er auch einfach <cstdio> includen.

    eine funktionierende lösung mit multithreading könnte z.B. so aussehen(ungetestet!):

    #include<iostream>
    #include<windows.h>
    #include<windowsx.h>//für multithreading beötigt
    #include<cstdio>//auch für multithreading benötigt
    using namespace std;
    
    DWORD WINAPI ThreadFunc(LPVOID IpParameter)//Funktion des Threads(anweisungen)
    {
    cout<<"Bitte geben Sie in s ein wie lange gewartet werden soll!\n";
    int wartezeit;
    cin>>wartezeit;
    Sleep(wartezeit*1000);
    //hier kommt rein was der timer nach ablauf tun soll
    }
    
    int main()
    {
    DWORD ThreadID;//ThreadID des erstellten threads wird hier gespeichert
    HANDLE handle=CreateThread(0, 0, ThreadFunc, 0, 0,&ThreadID);/*erstellt den thread und speichert das handle*/
    //hier der weitere code was das main-programm tun soll während der timer läuft
    WaitForSingleObject(handle, INFINITE);//wartet bis der thread fertig ist
    }
    

    Ich denke die beste alternative dazu wäre die von pumuckl:

    pumuckl schrieb:

    Davon abgesehen gibts in der doku zu boost::asio ein kleines Tutorial wo es sich um Timer u.ä. dreht. Das Ganze dann Plattformunabhängig.

    mfg,
    andi01.



  • Sleep hab ich schon mal mehrmals verwenden finde es aber irgendwie sch****

    Also Danke für die Antworten 👍 😃

    Mals sehen wie ich das Problem löse 😉



  • Sry hab mich mehrmals verschrieben 😃 😃 😃 🙄



  • DingDong schrieb:

    Sleep hab ich schon mal mehrmals verwenden finde es aber irgendwie sch****

    naja wie gesagt kannst du alternativ wenn du multithreading benutzen willst SetTimer() verwenden, was den code aber eigentlich nur komplizierter macht weils sleep für einfache wartezeiten bei timern eigenlich genauso tut.

    die verwendung von sleep ist nur ohne multithreading etwas ungünstig weil das programm dann während der unter Umständen längeren wartezeit keinerlei reaktionen auf benutzeraktionen zeigt und währenddessen nichts anderes tun kann, hier arbeitet main aber ungestört weiter!

    und wenn du gar kein multithreading nehmen willst kannste ja auch die lösung von pumuckl verwenden.

    mfg,
    andi01.



  • Eventuell nützt dir auch eine dieser Funktionen: http://msdn.microsoft.com/en-us/library/ms687069(VS.85).aspx



  • wenn dann höchstens die time-out funktionen wie timeBeginPeriod usw., denn die anderen sind für multithreading usw.(zB WaitForSingleObject, WaitForMultipleObjects) und warten auf prozesse/threads.


Anmelden zum Antworten