1

何らかの理由で、任意のコントロールを押し下げる (クリック アンド ホールド) と、アプリの NSTimer がフリーズし、マウス ボタンを離すまで起動しません。マウスを押している間は起動しません。これは短時間なら問題ありませんが、ポップアップ メニューを開いたり、コンボ ボックスをドロップダウンしたりするとフリーズします。

見落としがあるかどうかはわかりませんが、これは間違った動作のようです。

NSTimer 全体がフリーズする (NSView を再描画する) ことなく、NSPopUpButtonCell の下矢印をクリックする (または NSTableView をクリックしたままにする) ことができるようにしたいと考えています。

コメント/提案をいただければ幸いです。

NSTimer は、モード NSDefaultRunLoopMode で currentRunLoop に追加されます。

4

3 に答える 3

8

マウスがダウンしている間、実行ループはNSEventTrackingRunLoopMode. したがって、EventTracking イベント キューで受信されないイベントは、実行ループが適切なモードに戻るまで処理されません。

これを回避するには、両方のモード (デフォルトとイベント追跡) のランループにタイマーを追加します。

于 2011-01-07T05:52:54.580 に答える
8

2 つ以上のタイマーを異なる実行ループに追加したり、マルチスレッドを使用したりする代わりに (別のスレッドから UI を更新できなくなるため)、単純にタイマーを NSRunLoopCommonModes に追加します。

NSTimer *myTimer = [NSTimer timerWithTimeInterval:RefreshInterval target:self selector:@selector(doWork) userInfo:nil repeats:YES];
  [[NSRunLoop currentRunLoop] addTimer:myTimer forMode:NSRunLoopCommonModes];
于 2011-02-08T00:56:13.127 に答える
0

アプリケーションで 1 つのスレッドだけを扱っていると仮定すると、説明したことは完全に予想されます。デフォルトでNSTimerは、 が current に追加さNSRunLoopれます。これは、あなたの場合、UI インタラクションの処理も担当します。UI インタラクションの処理に拘束されると、タイマーをチェックして「起動」することができません。

解決策は、このタイアップを回避するためにマルチスレッドを使用することですこれはまさにこのテーマに関する素晴らしいブログ投稿です: http://blog.narent.com/?p=21

EDIT:代替(およびよりエレガントなIMO)ソリューションについては、Daveの投稿を参照してください

以下も参照してください。

于 2011-01-07T05:52:13.493 に答える