macOS High Sierra 10.13.4で困ったこと、画面がロックされるとウィンドウ系のイベントが担保されません
macOS High Sierra 10.13.4へアップグレードしましたか?持っていないので関係ありませんがeGPUをサポートしているのが話題になっていますよね。アップデート後、少し困ったことになっています。これは10.13.5で解消されるのか?別の対処方法があるのか?10.13.4は出たばかりで情報がなく困っています。Safariもセキュリティが強化されましたね。セキュリティの強化は、結果的に使い勝手が悪くなることにつながることが良くわかりました。
MacBook Pro Retina Mid2015とLate2012をmacOS High Sierraで使っています。Late2012は眠らないMacの設定(コンピューターをスリープしない設定 Late2012はこれができます)で自作アプリを常時動かしています。
macOS High Sierra 10.13.4にアップデートした後、しばらくしてから気がつきました。ひょっとするともう少し前のバージョンから始まっていたのかもしれません。macOS High Sierraで追加されたとても便利な「画面をロック」、または「スクリーンセーバーが動作した後」、しばらくするとアプリの動作が緩慢になります。
コンピューターをスリープしないのでアプリは裏で動いています。利用者がいない状態(画面がロックされた、スクリーンセーバーが動き始めた)とmacOSが認識すると画面系のイベントループがとても遅くなるということだと思います。
例えば、これは、1秒間(Timer.scheduledTimer)でログする(TextViewに時間と呼び出し回数を記録する)という単純なアプリを動かしたまま、画面をロックし、ロックを解除した後の動作結果です。
1秒間隔で呼び出し、呼び出されたログに時間と呼び出し回数を記録、1秒後にタイマーをセットという処理を繰り返しています。それなのにご覧のように6秒、10秒といった間隔で呼び出されています。
1秒間隔で呼び出された箇所をOK、それ以外の間隔で呼びさられた箇所をNGにしています。NGが目立ちますね。
OK 2018年4月2日 12:05:00 JST 79
OK 2018年4月2日 12:05:01 JST 80
NG 2018年4月2日 12:05:07 JST 81
OK 2018年4月2日 12:05:08 JST 82
NG 2018年4月2日 12:05:28 JST 83
OK 2018年4月2日 12:05:29 JST 84
NG 2018年4月2日 12:05:36 JST 85
NG 2018年4月2日 12:05:40 JST 86
NG 2018年4月2日 12:05:49 JST 87
NG 2018年4月2日 12:05:54 JST 88
NG 2018年4月2日 12:06:00 JST 89
OK 2018年4月2日 12:06:01 JST 90
NG 2018年4月2日 12:06:09 JST 91
OK 2018年4月2日 12:06:10 JST 92
=>画面がロックされるとウィンドウ系のイベントが担保されません
人が休んでいる間に、しっかり仕事をしている賢い子だったんですが、最近はサボることを覚えてしまったようです。とても残念な変更です。
ちなみに、cronでスケジュール処理を動かしています。こちらは、時間とおりきっちり仕事をしてくれています。
初期、スケジューラー(cron)でアプリを起動し、処理したら自動終了させるような自作アプリを作って見ました。スリープしていてもmacOS/OS Xは一定間隔で少し起きて処理をしてまた寝るという感じの動作をします。電源の管理で起きる時間を設定し、この時間に処理をすれば常時起動しなくてもいいね!というナイスな発想だったんですが、結果的には愚策でしたよ。
スリープ中に動作したタイミングでウィンドウがあるアプリを起動させることはできませんでした。kernelでガードされている感じです。内容は忘れちゃいましたが、エラーメッセージもなんだかとっても特徴的だったことを覚えています。あぁ、このタイミングでは動かしちゃいけなんですね。と理解しました。
失敗を踏まえて、スリープしない設定にして動かすようにしています。エコなアプリ設計をしているのでアプリ自体がCPUをぶん回すようなことはしないようにしています。
アプリはデータベースに新たな要求を受け付けると動作します。データベースに要求をぶち込むタイミングはcronで制御しています。時間になると即座に動き、求めている作業を完了してくれます。一定間隔でこれを繰り返していました。開始時間が遅れることはなかったです。
High Sierraになり、サボりまくりです。
cronは時間通りに動作します。画面系イベントは信頼できないことがわかりました。現状はアプリを捨てるしかありませんね。困りました。進展あったらここに追記しますね。
macOS High Sierra 10.13.4で困ったこと
MacBook Pro Retina Mid2015とLate2012をmacOS High Sierraで使っています。Late2012は眠らないMacの設定(コンピューターをスリープしない設定 Late2012はこれができます)で自作アプリを常時動かしています。
macOS High Sierra 10.13.4にアップデートした後、しばらくしてから気がつきました。ひょっとするともう少し前のバージョンから始まっていたのかもしれません。macOS High Sierraで追加されたとても便利な「画面をロック」、または「スクリーンセーバーが動作した後」、しばらくするとアプリの動作が緩慢になります。
コンピューターをスリープしないのでアプリは裏で動いています。利用者がいない状態(画面がロックされた、スクリーンセーバーが動き始めた)とmacOSが認識すると画面系のイベントループがとても遅くなるということだと思います。
例えば、これは、1秒間(Timer.scheduledTimer)でログする(TextViewに時間と呼び出し回数を記録する)という単純なアプリを動かしたまま、画面をロックし、ロックを解除した後の動作結果です。
1秒間隔で呼び出し、呼び出されたログに時間と呼び出し回数を記録、1秒後にタイマーをセットという処理を繰り返しています。それなのにご覧のように6秒、10秒といった間隔で呼び出されています。
1秒間隔で呼び出された箇所をOK、それ以外の間隔で呼びさられた箇所をNGにしています。NGが目立ちますね。
OK 2018年4月2日 12:05:00 JST 79
OK 2018年4月2日 12:05:01 JST 80
NG 2018年4月2日 12:05:07 JST 81
OK 2018年4月2日 12:05:08 JST 82
NG 2018年4月2日 12:05:28 JST 83
OK 2018年4月2日 12:05:29 JST 84
NG 2018年4月2日 12:05:36 JST 85
NG 2018年4月2日 12:05:40 JST 86
NG 2018年4月2日 12:05:49 JST 87
NG 2018年4月2日 12:05:54 JST 88
NG 2018年4月2日 12:06:00 JST 89
OK 2018年4月2日 12:06:01 JST 90
NG 2018年4月2日 12:06:09 JST 91
OK 2018年4月2日 12:06:10 JST 92
=>画面がロックされるとウィンドウ系のイベントが担保されません
人が休んでいる間に、しっかり仕事をしている賢い子だったんですが、最近はサボることを覚えてしまったようです。とても残念な変更です。
ちなみに、cronでスケジュール処理を動かしています。こちらは、時間とおりきっちり仕事をしてくれています。
スリープしない設定にした理由と以前の動作
初期、スケジューラー(cron)でアプリを起動し、処理したら自動終了させるような自作アプリを作って見ました。スリープしていてもmacOS/OS Xは一定間隔で少し起きて処理をしてまた寝るという感じの動作をします。電源の管理で起きる時間を設定し、この時間に処理をすれば常時起動しなくてもいいね!というナイスな発想だったんですが、結果的には愚策でしたよ。
スリープ中に動作したタイミングでウィンドウがあるアプリを起動させることはできませんでした。kernelでガードされている感じです。内容は忘れちゃいましたが、エラーメッセージもなんだかとっても特徴的だったことを覚えています。あぁ、このタイミングでは動かしちゃいけなんですね。と理解しました。
失敗を踏まえて、スリープしない設定にして動かすようにしています。エコなアプリ設計をしているのでアプリ自体がCPUをぶん回すようなことはしないようにしています。
アプリはデータベースに新たな要求を受け付けると動作します。データベースに要求をぶち込むタイミングはcronで制御しています。時間になると即座に動き、求めている作業を完了してくれます。一定間隔でこれを繰り返していました。開始時間が遅れることはなかったです。
High Sierraになり、サボりまくりです。
対処法はあるの?
cronは時間通りに動作します。画面系イベントは信頼できないことがわかりました。現状はアプリを捨てるしかありませんね。困りました。進展あったらここに追記しますね。