2016-12-02 2 views
1

Nanosleep im iOS-Simulator (läuft auf MacOS Sierra mit XCode 8.1 und 8.2beta) schlafen etwa 5 mal länger als die gewünschte Dauer.Nanosleep zu lang in jedem iOS-Simulator auf MacOS Sierra

Dies passiert nicht auf dem echten iPhone 7 oder in einer macOS Sierra App, nur im Simulator.

Ist es möglich, eine genauere Schlafdauer im Simulator zu haben oder ist es ein Fehler?

struct timespec request; 
request.tv_sec = 0; 
request.tv_nsec = 17000000; // 17ms 

mach_timebase_info_data_t base; 
mach_timebase_info(&base); 

while (1) { 
    uint64_t start, end, elapsed; 
    start = mach_absolute_time(); 

    nanosleep(&request, NULL); 

    end = mach_absolute_time(); 
    elapsed = (end - start)/base.denom; 

    printf("Sleep = %f msec\n", elapsed * 1E-6); 
} 

Ausgang:

 

    Sleep = 84.451425 msec 
    Sleep = 69.947846 msec 
    Sleep = 95.484521 msec 
    Sleep = 72.795438 msec 
    Sleep = 80.162972 msec 
    Sleep = 70.265713 msec 
    ... 

Antwort

1

Die ony GARANTIEN SYSCALL, dass Sie nach der gewünschten Dauer zu einem bestimmten Zeitpunkt eingeplant werden. Sie sollten keine Annahmen darüber treffen, wie bald danach.

Es gibt ein Problem mit Xcode 8.0-8.2, das auf Sierra läuft, das verursacht, Simulatorprozesse mit einer niedrigeren Priorität als geplant geplant zu werden. Dies ist wahrscheinlich der Grund, warum Sie diesen Unterschied im Verhalten zwischen Gerät und Sim sehen.

+1

Jeremy und @rußbischof, Danke! : D Ich habe auch ein Prioritätsproblem erwartet! – Kris

+0

@Kris Bitte überprüfen Sie Xcode 8.3 Beta und melden Sie sich zurück, wenn das Ihr Problem angeht. Wenn nicht, bitte aktualisieren Sie mit der Ausgabe von 'sudo taskinfo ' –

+0

in Xcode 8.3 Beta behoben! Vielen Dank!! Tatsächlich haben wir einen Workaround für den Xcode 8.2 Simulator verwendet -> eine Schleife mit mehreren kleinen Schlaf- und Zeitprüfungen. – Kris