11

OS X がアプリに回転するビーチ ボールを与えることを決定するのはいつですか? これを回避するためにアプリケーションをプログラミングするときに何ができますか?

4

3 に答える 3

20

ウィンドウ サーバーは、最前面のアプリケーション、またはマウス ポインターの下にウィンドウがあるアプリケーションが特定の時間内にウィンドウ サーバーからのイベントに応答しなかった場合に、回転する待機カーソルを表示します。

回転する待機カーソルを回避するには、アプリケーションはタイムリーにイベントを処理する必要があります。このウィンドウ サーバーの動作を回避する方法はありません。これには正当な理由があります。Mac OS X 上のアプリケーションがユーザーに応答しなくなることは想定されていません。

于 2009-01-18T05:38:46.680 に答える
7

理由は、アプリが UI をブロックしているためです。他の投稿者が言ったように、ウィンドウ マネージャーは、しばらくの間イベントを処理していないことに気づき、この UI を表示することができます。

ほとんどの場合、UI (デフォルト) スレッドで同期的に IO (ディスクへの読み取りまたは書き込み、またはネットワーク要求の実行など) を実行しています。アプリの応答性を維持する (したがって、ビーチボールを回避する) ための経験則として、UI スレッドで同期 IO を実行しないことです。非同期 IO (コールバックを受け取り、バックグラウンド スレッドで動作し、完了時に UI スレッドで通知する API) を使用するか、別のバックグラウンド スレッドを使用して作業を行うことができます。

IO を実行していない場合は、UI スレッドである種の長いループが発生し、応答しなくなっている可能性があります。その場合は、ループを最適化または削除するか、バックグラウンド スレッドに移動します。

于 2009-01-18T06:54:24.173 に答える
6

アプリケーションに十分なハードウェア リソースがあると仮定すると (実際には常にそうであるとは限りません)、アプリケーションがビーチボールを行う理由はまったくありません。その場合は、コードのどのセクションがユーザー インターフェイスをブロックしているかを特定し (直感的でない場合は、Shark.app が役立ちます)、それをバックグラウンド スレッドに移動します (または、一時停止をなくすために別の戦略を使用します)。幸いなことに、Cocoa と Objective-C にはスレッド化のための非常に優れたツールがあります。まず NSOperationQueue を参照してください。Apple には、パフォーマンス チューニングに関する優れたドキュメントもいくつかあります。関連するリンクについては、この質問を参照してください。

于 2009-01-18T06:04:20.780 に答える