2016-12-02 4 views
1

iOSシミュレータのNanosleep(MacOS SierraでXCode 8.1と8.2betaで動作)は、希望の持続時間より5倍長くスリープします。iOSシミュレータでnanosleepが長すぎるSierra

実際のiPhone 7デバイスやMacOS Sierraアプリでは、シミュレータでのみ発生します。

シミュレータでより正確なスリープ時間を設定することは可能ですか、それともバグですか?

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); 
} 

出力:あなたが要求した期間の後にいくつかの点で、スケジュールされますONY guranteesをシステムコール

 

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

答えて

1

。あなたはどのくらい後になるかについて何も仮定してはいけません。

Sierraで動作しているXcode 8.0-8.2には、シミュレータプロセスが意図したよりも低い優先度でスケジュールされるという問題があります。これは、デバイスとSIMの動作の違いを見ている理由です。

+1

ジェレミーと@ルスビショップ、ありがとう! :D私も優先課題を予期していました! – Kris

+0

@Kris Xcode 8.3 Betaをチェックして問題が解決したかどうかを報告してください。そうでない場合は、 'sudo taskinfo 'の出力で更新してください。 –

+0

Xcode 8.3 betaで修正されました!ありがとう!!実際には、Xcode 8.2シミュレータの回避策を使用しました。>複数の小さなスリープと時間チェックを伴うループ。 – Kris

関連する問題