Nach Hause
Top.Mail.Ru Yandeks.Metrika
Forum: "Andere";
Aktuelles Archiv: 2017.03.26;
Herunterladen: [xml.tar.bz2];

Nach unten

WaitableTimer vs Schlaf Finden Sie ähnliche Zweige


DayGaykin ©   (2016-03-30 09:51) [0]

Ich habe kürzlich php-usleep studiert und die Frage aufgeworfen, warum sie es über WaitableTimer implementiert haben und nicht über normalen Schlaf (oder eine Schlafschleife für Verzögerungen von mehr als 2 ^ 32 usec):

https://github.com/php/php-src/blob/master/win32/time.c
Was ist die Erklärung dafür?



DayGaykin ©   (2016-03-30 09:58) [1]

Ich beeilte mich. Verwirrte Milli- und Mikrosekunden, das erklärt alles.



DVM ©   (2016-03-30 14:11) [2]

Es ist nicht nur eine Frage von Millisekunden oder Mikrosekunden, wahrscheinlich ist nur WaitableTimer unter Windows eine korrektere Methode.



DayGaykin ©   (2016-03-30 16:37) [3]

Erklärt



DayGaykin ©   (2016-03-30 16:37) [4]

Erklärt



Pavia ©   (2016-03-30 17:22) [5]


> Es geht wahrscheinlich nicht nur um Millisekunden oder Mikrosekunden
> WaitableTimer ist unter Windows eine korrektere Methode.

Wahrscheinlicheres Geschäft in APC.



DVM ©   (2016-03-30 22:16) [6]


> DayGaykin © (30.03.16 16: 37) [4]
> Erklärt

Nun, es ist offensichtlich, dass bei langen Ruheintervallen der periodisch in der Schleife aufgerufene Thread zum Aufwecken gezwungen wird, wodurch beispielsweise verhindert wird, dass der Code in die Auslagerungsdatei hochgeladen wird. WaitForXXX ist nicht blockiert und kann jederzeit unterbrochen werden.



Pavia ©   (2016-03-31 08:47) [7]


> Nun, es ist offensichtlich, dass in langen Schlafintervallen
> wird regelmäßig in einer Schleife aufgerufen und erzwingt das Aufwecken des Threads.
> wodurch beispielsweise verhindert wird, dass Code in die Auslagerungsdatei hochgeladen wird.
> WaitForXXX stört nicht und kann auch unterbrochen werden
> jederzeit.

Und wo hast du es bekommen? WaitForXXX und Sleep haben laut MSDN die gleiche Priorität. Und nach der Idee sollte das auch mit Swap funktionieren.
WaitableTimer arbeitet jedoch mit APC, das an einen direkten Interrupt gebunden ist. Und ihre Anzahl kann 10 000 pro Sekunde erreichen.
Angenommen, WaitableTimer kann mit einer Genauigkeit von bis zu 10 Mikrosekunden pausieren.
In der Praxis muss man messen, um zu sehen.



Игорь Шевченко ©   (2016-03-31 10:13) [8]

Pavia © (31.03.16 08: 47) [7]

"Sie, mein Herr, reden Unsinn. Und das Schlimmste ist, was Sie falsch und zuversichtlich sagen."



DVM ©   (2016-03-31 10:19) [9]


> Pavia © (31.03.16 08: 47) [7]


> Und wo hast du es bekommen? Wenn Sie der MSDN glauben, lautet die Priorität WaitForXXX
> und Schlaf sind ähnlich.

Es ist keine Priorität. Noch einmal. Um mit Sleep eine Verzögerung für ein großes Intervall zu machen und gleichzeitig das Warten zu unterbrechen, bleibt nichts anderes übrig, als Sleep in einen Zyklus zu setzen, der ein kleines Intervall anzeigt, und den Zyklus periodisch zu überprüfen, ob ein großes Intervall herausgekommen ist. Der Stream wird nach dem Verlassen des nächsten Ruhezustands ständig aufgeweckt. Mit WaitFor-Funktionen (mit denen Sie auch WaitableTimer erwarten können) wird der Thread so lange in den Ruhezustand versetzt, bis ein Ereignis eintritt. Und Sie können es jederzeit unterbrechen. Der Unterschied liegt auf der Hand.



DayGaykin ©   (2016-03-31 11:08) [10]


> DVM © (31.03.16 10: 19) [9]

Zum ersten Argument: "kleines Intervall" ist ungefähr 50 Tage. Es ist nicht zu teuer, den Code alle 50-Tage aus dem Swap zu holen.

In dem Code, den ich im Link-Handle angegeben habe, befindet sich eine lokale Variable. Ich bin nicht sicher, aber es scheint mir, dass dies bedeutet, dass niemand ihn zu irgendeinem Zeitpunkt unterbrechen möchte.
Darüber hinaus ist der Funktionsparameter int (soweit ich in C verstehe, ist dies auch ein 32-Bit), so dass das Einstellen des Intervalls zu lang für den Ruhezustand nicht funktioniert.

Daher komme ich zu dem Schluss, dass der Grund für die Verwendung des Timers detaillierter ist.

PHPAPI int usleep (unsigned int useconds) { GRIFF Timer; LARGE_INTEGER fällig; due.QuadPart = - (10 * (__int64) useconds); timer = CreateWaitableTimer (NULL, TRUE, NULL); SetWaitableTimer (Timer, & fällig, 0, NULL, NULL, 0); WaitForSingleObject (timer, INFINITE); CloseHandle (Timer); return 0; }



Pavia ©   (2016-03-31 11:19) [11]


> "Sie, Sir, reden Unsinn. Und das Schlimmste von allem, was Sie sagen
> kategorisch und selbstbewusst "

Ich hatte gute Lehrer, die niemals Fehler machen. ;-)



DVM ©   (2016-03-31 13:20) [12]


> DayGaykin © (31.03.16 11: 08) [10]
>


> Zum ersten Argument: "kleines Intervall" ist ungefähr
> 50 Tage. Es ist nicht zu teuer, den Code einmal aus dem Swap zu heben
> in 50 Tagen.

Du hast auch nichts verstanden. In der Version mit Schlaf haben Sie keinen Schlaf (50 Tage). Normale Leute schreiben nicht Schlaf (50 Tage)? Oder irre ich mich?

Es sagt Schlaf (einige Sekunden oder weniger) und setzt diesen Schlaf in eine Schleife. Dementsprechend wird dieser Strom während dieser 50-Tage für eine Art Holz viele Male aufgeweckt, obwohl er für 50-Tage ruhig schlafen und entladen werden könnte. In der Timer-Version schläft der Stream genau 50 Tage.

Im Allgemeinen ist es dumm, auf 50-Tage zu warten. Dies ist ein Timer, also ein Ausrutscher.


> Daraus schließe ich, dass der Grund für die Verwendung des Timers
> ausführlicher.
>

Na ja, nicht besonders groß.
Unter Windows gibt es eine Möglichkeit, die Genauigkeit auf Nanosekunden genau zu halten, allerdings auf Kosten einer vollen Auslastung von einem Kern.



DayGaykin ©   (2016-03-31 16:23) [13]


> Normale Leute schreiben nicht Sleep (50 Tage)? Oder irre ich mich?

Normale Leute werden ein bisschen Mathe benutzen.



Inovet ©   (2016-03-31 17:36) [14]

> [13] DayGaykin © (31.03.16 16: 23)
> Normale Leute wenden etwas Mathe an

Erzähl mir mehr?



DayGaykin ©   (2016-03-31 17:44) [15]


> Erzähl mir mehr?

Warum? Trolle füttern?



Inovet ©   (2016-03-31 17:47) [16]

> [15] DayGaykin © (31.03.16 17: 44)

Und wer sind die Trolle hier? Es scheint den Unterschied klar erklärt zu haben. Sleep () ist eigentlich nicht dafür ausgelegt, Zeitintervallen standzuhalten. Woher kommt ein solcher Wunsch, es für diese Zwecke zu vermasseln.



KSergey ©   (2016-04-01 10:08) [17]

> Inovet © (31.03.16 17: 47) [16]
> Sleep () ist eigentlich nicht dafür ausgelegt, Zeitintervallen standzuhalten.

Entworfen, wenn keine Wartezeit zum Unterbrechen eines externen Ereignisses besteht.
Wenn Sie an allen 50-Tagen genau einschlafen müssen, ist Slip eine geeignete Lösung.



DVM ©   (2016-04-01 10:28) [18]


> KSergey © (01.04.16 10: 08) [17]


> Wenn Sie an allen 50-Tagen genau einschlafen müssen, ist ein Slip geeignet
> Lösung.

Und wie unterbrechen wir das Programm mit einem Zettel für 50-Tage? Oder drehen wir den Schlupf in einem Zyklus mit einem kleinen Intervall?



KSergey ©   (2016-04-01 10:56) [19]

Lesen Sie sorgfältig.
Entsprechend den Bedingungen der Aufgabe müssen wir alle 50-Tage einschlafen, ohne den Schlaf zu unterbrechen.
Was stört dich sonst noch?



DVM ©   (2016-04-01 11:17) [20]


> KSergey © (01.04.16 10: 56) [19]


> Entsprechend den Bedingungen der Aufgabe müssen wir alle 50-Tage ohne Unterbrechung einschlafen
> schlafen.

Unter welchen bedingungen Erfunden? Das passiert nicht im Leben, es passiert nur in der Theorie.
Es kann immer notwendig sein, den Dienst neu zu starten, der 50-Tage auf etwas wartet, und in diesem Fall muss er genagelt werden oder etwas mit Datenverlust?
Wer im Ruhezustand auf Zeitintervalle von mehr als einer Sekunde wartet, muss als ungeeignet eingestuft werden. Und für kleine Intervalle gibt es zuverlässigere und genauere Lösungen.



KSergey ©   (2016-04-01 12:14) [21]

> es gibt zuverlässigere,

Was ist die Unzuverlässigkeit von Schlaf ()?



DVM ©   (2016-04-01 12:55) [22]


> Was ist die Unzuverlässigkeit von Schlaf ()?

In niedriger Auflösung. In Ermangelung jeglicher Garantien zur Einhaltung kleiner Intervalle. Natürlich können Sie versuchen, die Auflösung zu verbessern, indem Sie timeBeginPeriod () aufrufen. Diese Krücke kann jedoch nicht dauerhaft verwendet werden, da Dies kann sich nachteilig auf viele Dinge wie Uhren und mehr auswirken. Aber das ist nicht die Hauptsache. Sleep ist keine Funktion zum Warten auf Zeitintervalle, sondern hat einen anderen Zweck: den Thread von der ihm zugewiesenen Prozessorzeit abhalten zu lassen, was nicht dasselbe ist. Zum Warten verfügt Windows über Timer und Wartefunktionen.

Weitere Details zu den Mängeln finden Sie hier:
https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms686298(v=vs.85).aspx



KSergey ©   (2016-04-01 13:14) [23]

Unsicherheit in was?
Arbeitet sie nicht immer?

Ich bin nach wie vor der Meinung, dass "an 50-Tagen einschlafen" - Schlaf ist großartig. Beachten Sie, dass Sie nicht "auf etwas warten", sondern "für 50-Tage einschlafen" müssen.

Auf jeden Fall war es informativ, danke.



Inovet ©   (2016-04-01 18:43) [24]

> [23] KSergey © (01.04.16 13: 14)
> "An 50-Tagen einschlafen" - Schlaf ist großartig

Vielen Dank für die Kommunikation, aber ich werde ein wenig von mir selbst korrigieren: um anderen meine nutzlose Zeit für 50-Tage zu geben. :)



Seiten: 1 ganze Branche

Forum: "Andere";
Aktuelles Archiv: 2017.03.26;
Herunterladen: [xml.tar.bz2];

nach oben









Speicher: 0.66 MB
Zeit: 0.036 c
15-1459546202
Jury
2016-04-02 00:30
2017.03.26
Alles Gute zum Geburtstag ! 2 April 2016 Samstag


4-1282048057
mc.fly
2010-08-17 16:27
2017.03.26
Wie erstelle ich ein Pufferbild im Speicher? Ohne VCL.


2-1396021466
DQ
2014-03-28 19:44
2017.03.26
Verwenden der Datentypen Enumeration und Set


2-1437985170
Grau-grau
2015-07-27 11:19
2017.03.26
Delphi XE8-Projektfehler beim Erstellen der VCL-Formularanwendung


15-1459502027
Ksergey
2016-04-01 12:13
2017.03.26
Windows "Talker": Durch die API eine männliche oder weibliche Stimme lernen?





Afrikanisch Albanien Arabisch Armenisch Aserbaidschanisch Baskisch Weißrusse Bulgarian katalanisch Chinesisch (vereinfacht) Chinesische Tradition) kroatisch Tschechisch Dänisch Dutch Englisch estnisch Philippinisch Finnish Französisch
Galicisch Georgisch Deutsch Griechisch haitian Creole Hebräisch Hindi ungarisch isländisch Indonesian irisch Italian Japanisch Koreanisch lettisch litauisch Makedonisch Malay Maltesisch Norwegian
persisch Polnisch Portugiesisch Rumänisch Russisch serbisch Slovakisch Slowenisch Spanisch Suaheli Swedish Thai Türkisch Ukrainisch Urdu Vietnamesisch Walisisch Jiddisch Bengalisch bosnisch
cebuano Esperanto Gujarati Hausa Hmong igbo Javanisch kannada khmer Laotisch Lateinisch Maorisch Marathi Mongolisch nepali Pandschabi Somalisch Tamilisch Telugu Yoruba
Zulu
Английский Französisch Deutsch Italienisch Португальский Russisch Spanisch