Warum würde ich Sleep() mit unendlichen timeout?
Laut MSDN, Sleep() bereitgestellt werden können INFINITE
- Wert "zeigt an, dass die suspension sollte nicht time out".
Warum möchte ich zu rufen Sleep() mit INFINITE
timeout in meinem Programm?
- Meine Antwort war: Weil Sie absolut sicher sind, dass Sie Ihren Faden wieder aufgenommen wird, durch einen anderen thread, aber Sie haben keine Mittel, um zu wissen, Wann wird dies geschehen. Wie auch immer, das muss mit Sorgfalt verwendet werden, und es ist normalerweise eine gute Idee, einen (halbwegs) großen timeout statt, signalisiert ein "timeout error", wenn es abläuft. Ich habe sieben upvotes es. Aber dann habe ich drei unerklärliche downvotes, also beschloss ich, es zu löschen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es keine Gründe, die man in seinem gesundem Verstand ist, würde jemals Sleep(INFINITE). Es hat keine praktische Bedeutung.
Ist es für die Allgemeinheit und Symmetrie zu WaitForSingleObject(..., timeout) und SleepEx(timeout), wo UNENDLICHE macht Sinn.
Daran erinnert, dass SleepEx werden versuchen, Sie zu konsumieren, Dinge aus deinem thread APC-queue.
Benutzt habe ich Sleep(INFINITE) und es macht absolut Sinn. Ich habe es verwendet, um zu halten den thread am Leben. Ich habe mich registriert für WMI-Ereignis-Benachrichtigung (ExecNotificationQueryAsync, der erhält Ereignisbenachrichtigung unendlich), dann müssen Sie halten die Anwendung lebendig. dont' wissen, ob dies Sinn für Sie.
Einen Schlaf ohne Zeitlimit nicht mit einem timer. Dies reduziert den overhead wo Sie erwarten, dass eine variable-Länge warten aber absolut sicher, dass der Faden wieder aufgenommen werden.
Soweit ich weiß, Schlafen Sie, seit Sie eingeführt SleepEx, es ist nur eine dünne, bequeme wrapper um SleepEx, und wenn Sie schrieb es als wrapper, beschlossen Sie einfach den timeout-parameter zu SleepEx, ohne Verarbeitung, in irgendeiner Weise. Offensichtlich auf diese Weise das Verhalten der Funktion mit UNENDLICH als timeout weitergegeben wird, auch zu Schlafen (und so dokumentiert werden müssen), obwohl Sie, ohne die bAlertable parameter der SleepEx, es ist völlig nutzlos (ein Sleep(timeout) ist gleich SleepEx(timeout, FALSE), so müssen Sie eine unendliche nonalertable warten).
Windows CE, dann können Sie sich entschieden haben, um dieses Verhalten zu ändern, weil es war eigentlich albern, so dass ich denke, dass ein Sleep(INFINITE) auf CE wird automatisch übersetzt, um eine SuspendThread; jedoch auf Windows, sind Sie wahrscheinlich gezwungen, zu halten die "einfachen" Verhalten aus Gründen der Kompatibilität.
Zusätzlich zu dem, was gesagt wurde (im Grunde das warten auf einen interrupt zu passieren), könnten Sie sehr wohl ein unendliches timeout, ohne wahnsinnig. Zum Beispiel, ich habe eine Anwendung (ein Arbeiter), der braucht nicht mehr als 3 verschiedene Dinge gleichzeitig.
Habe ich mich entschieden, jedem dieser Arbeit führen in neue Themen ein und haben ein unendliches timeout in der Main () - thread (als das Programm soll nicht beenden, außer wenn eine Ausnahme ausgelöst wird, in dem Fall die ganze app neu gestartet wird), für die Bequemlichkeit und Lesbarkeit (ich kann den Kommentar aus einem der 3 funktioniert, ohne das Globale Verhalten oder einfach teilen Sie Sie auf verschiedene Arbeitnehmer, wenn nötig).
Dies ist wahrscheinlich fügt ein sehr kleiner Aufwand im Vergleich zu 2 neuen thread + der Haupt-thread tun, der 3. Arbeit, aber es ist vernachlässigbar angesichts heute Computer-Auftritte und Speicher.
Gut, Wenn wir warten müssen, bis ^C, aber wir wollen nicht while(1);