0

ときどき、Cocoa コード セグメントでポップアップ アラート ウィンドウを作成する必要があります。以前はNSAlert、直接使用した後、目標を達成するのがより簡単runModalであることがわかりましたが、行かなければなりませんでした。NSRunAlertPanelそこで、すべてのアラート機能を に切り替えることにしましたNSRunAlertPanel。ほとんどの場合、問題ないように見えました。</p>

今、マルチスレッドを追加しています。メインスレッドでコールバックする場合NSRunAlertPanelよりも明らかに遅いように見えることがわかりました。NSAlert

コード セグメント:

まず、スレッドを作成します。

[NSThread detachNewThreadSelector: @selector(tryRunLoop:) toTarget:self withObject:nil];

次にtryRunLoop、このスレッドのこの関数は、メイン スレッドのアラート ウィンドウ関数を呼び出します。

while(1)
[self performSelectorOnMainThread:@selector(showAlert:) withObject:anObject waitUntilDone:YES]; 

メインスレッドの関数showAlertは残りのことを行います:

NSRunAlertPanel(@"Warning:",@"Just testing", @"YES", nil, nil);

時間の経過とともに、ポップアップ ウィンドウの応答が遅くなります。NSAlert代わりに使用するNSRunAlertPanelか、メイン スレッドで popup メソッドを実行しなければ、症状は消えるはずです。

また、これら 2 つの方法では CPU 使用率も異なることがわかりました。常にボタンを押している間、明らかにNSAlertCPU使用率が低くなります。

誰かがこれらの現象を説明できますか?

PS: 元のプロジェクト全体をオンラインで公開することは許可されていなかったため、Github で簡単な Cocoa プロジェクトを作成して症状とURLKnown issuesをシミュレートしました。最初に Readme ファイルを参照してください。

4

1 に答える 1