2012-01-09 10 views
0

私は、「AppKitのコントロールは、メインスレッド以外のスレッドから更新するのは親切ではありません」と言われています。AppKitへの独立したプロセスを効率的に行うにはどうすればいいですか?

私は2つのプロセスがあります。

NSThread *thread_Client = [[NSThread alloc] initWithTarget:self selector:@selector(myTcpClient) object:nil]; 
NSThread *thread_Display = [[NSThread alloc] initWithTarget:self selector:@selector(displayData) object:nil]; 

が、しばらくした後にそれが出て空白またはロックアップ:

- update variables in the heap periodically 
- display values from the heap to the display 

を私がしたんです。

もっと良い方法はありますか?

thx

+3

今あなたのアプリはUIを更新するためにバックグラウンドスレッドのwhileループで回転しています。あなたがコントロールに書き込むことができたとしても、あなたはたくさんのサイクルを無駄にしています。代わりに、0.5秒ごとなど、より合理的なリフレッシュレートで呼び出されるタイマーを追加してみてください。タイマーをメインスレッドにアタッチし、コールバックメソッドでUIを更新します。 –

+0

NSTimerは別のスレッドだと思ったのですか?私はスリープ(100)を追加してそれが役立つかどうかを調べるつもりでした。 – jdl

+1

NSTimerは「別のスレッド」ではありません。あなたがしていることを本当に理解することなくスリープ(100)を追加することは、いずれかの方法にはなりません。ジェイソンの提案は健全です。私はそれが実際にどのように動作するのかを理解するためにNSTimerを読んで、そこから行くことをお勧めします。 –

答えて

0

私はあなたがしようとしていることについて少し不明です。バックグラウンドスレッドで周期的な操作を実行しようとしているようで、各サイクルの終わりに結果を使用してUIを更新しているようです。他の投稿では、NSTimerをメインスレッド(UIの更新に使用するスレッドのみ)で使用することをお勧めします。あなたはタイマーを頻繁に(繰り返し)発射させます。起動時に呼び出されるコールバックでは、バックグラウンドスレッドによって更新されるオブジェクトのデータ/情報を適切なUIビューにコピーしてから、setNeedsDisplayを呼び出してUIを更新します。問題は、使用している情報の一貫性です。バックグラウンドスレッドがオブジェクトの更新を続けている場合は、古い情報と新しい情報の組み合わせをUIにコピーできます。おそらく、バックグラウンドが塗りつぶされた後、UIアップデータに渡される「配信」オブジェクトが必要です。そのようなオブジェクトには、バックグラウンドサイクルの終わりに得られる情報の一貫したセットが含まれます。

いずれにしても、メインスレッドでスリープ状態にしたくない場合があります。 UIレスポンスが遅くなるだけです。

+0

私はSleepを "while loop"内のNSThreadに追加して減速させようとしていました。 – jdl

+0

おそらくバックグラウンドスレッドの性質を使って '組み込み'の遅延を提供することができますか?例えば、。それは何かを待つ必要がありますか?真に同じ計算を繰り返すだけなら、睡眠は各計算サイクルの間にバックグラウンドスレッドを遅らせる妥当な方法です。 –

関連する問題