Sleep angaben



  • tagchen...
    nur ne kurze dumme frage..
    wie lange kann man ein programm "schlafen / ruhen" lassen.
    also was ist der maximalste wert, der in einem sleep befehl übergeben werden darf???

    THX a lot
    cu bart



  • unbegrenzt?!

    ich kenn nur die Genauigkeit der Func, die beträgt nämlich 10ms, also ist Sleep(1) == Sleep(10)



  • Ich denke Du solltest in der MSDN mal nachschauen.

    VOID WINAPI Sleep(
    DWORD dwMilliseconds
    );

    Parameters
    dwMilliseconds
    [in] The minimum time interval for which execution is to be suspended, in milliseconds.
    A value of zero causes the thread to relinquish the remainder of its time slice to any other thread of equal priority that is ready to run. If there are no other threads of equal priority ready to run, the function returns immediately, and the thread continues execution.

    A value of INFINITE indicates that the suspension should not time out.

    Mehr wie den maximalen Werteumfang eines DWORDS kannst Du nicht übergeben. Das wird da auch sicher mit INFINITE gemeint sein. Interessant ist die Übergabe einer Null bei der Verwendung von Threads. Damit kann man dem Scheduler sagen, dass er auch den Prozessor an andere Threads weitergeben kann.

    Ich mag keine Sleep-Aufrufe, außer die letzte Möglichkeit vielleicht.



  • tagchen...
    thx für die schnelle antwort...

    also ich kann ein programm unbegrenzt aussetzen? das heisst ich kann es bspw. über 10 stunden ruhen lassen?



  • Bart Simpson schrieb:

    tagchen...
    thx für die schnelle antwort...

    also ich kann ein programm unbegrenzt aussetzen? das heisst ich kann es bspw. über 10 stunden ruhen lassen?

    Theoretisch würde ich ja sagen, ich sehe aber darin keinen Sinn (aber das steht hier nicht zur Debatte).
    DWORD müsste ein unsigned long sein (Wertebereich 0...4.294.967.295 bei 32 bit).
    10 h in ms umgerechnet dürften 10x60x60x1000 ms, also 36.000.000 ms sein. Ich versehe immer noch nicht ganz den Sinn. Was willst Du denn tun? Ein Sleep blockiert doch komplett den Prozessor?



  • danke erstmal...

    was ich machen will.
    ich schreibe ein prog das einerseits einen datenaustausch zwischen zwei Datenbanken und zwischen zwei programmen und andererseits ein backup machen soll.
    der Admin hat dabei die möglichkeit Intervalle anzugeben, wann ein datenaustausch und wann ein backup gezogen werden soll.
    daher kam ich auf die idee, das in threads umzusetzen und dann mittels einer sleep funktion diese je nach angabe der intervalle auszusetzen....

    oder hast du noch ne andere idee wie ich das machen kann?
    muss dazu sagen, bin ein anfänger auf dem gebiet.

    thx a lot.
    cu bart



  • Oh je, das würde ich nicht so machen. Wenn Du es schon über die Laufzeit des Programms machen willst so schaue Dir mal in der MSDN die Funktion GetTickCount() an. Damit kann man auch Zeitspannen festlegen, die nicht so genau sein müssen. Eine andere Möglichkeit ist einfach über die Systemzeit. Die müsste zu Programmstart abgefragt werden und dann durch zyklisches Abfragen auf Erreichen einer vorgegebenen Zeitspanne überprüft werden.
    Außerdem ruht ja nicht Dein Programm wenn Du mit mehreren Threads arbeitest. Das komische ist nur wenn Du einen Workerthread mit einer Sleep-Methode blockierst dann ist das Beenden des Programms etwas fragwürdig.



  • Was passiert wenn der Benutzer die Zeitspanne ändert?



  • Nochmals zur ursprünglichen Frage:

    Der max. Timeout-Wert ist "INFINITE".
    INFINITE ist nicht wirklich INFINITE, sondern
    922337203685477,5808 ms (ergibt sich aus der internen Ausflösung des Timers, welcher 100 ns ist (siehe FILETIME).
    Eine relative Zeit wird mittels einem negativen Vorzeichen dargestellt... somit bleibt 2^63 als Zahlenwert übrig... und das ist die obige Zeit.

    Entspricht ungefähr 29427 Jahre... hat also doch etwas ähnlichkeit mit "INFINITE".



  • Also ich würde schon "MsgWaitForMultipleObjectsEx" verwenden um auf Messages reagieren zu können (z.b. ua. WM_QUIT zum beenden) und sonst keine Rechenzeit zu verschwenden. Weiterhin kannst Du das Timeout auf z.b. 10 sec setzen und beimm TimeOut ein vorher gesetzter GetTickCount Wert prüfen um ggf. die Backup Funktion aufzurufen. Es wäre denkbar dem Thread über USER Definierte Messages andere Start / Wartezeit zu senden.

    gruss
    Marcus


Anmelden zum Antworten