6

たくさんの作業を行っているバックグラウンドスレッドがあります-アプリケーションをロードしています。メインスレッドは、UIProgressViewに進行状況を表示しています。

バックグラウンドスレッドはperformSelectorInBackgroundで生成されています(ただし、別のアプローチでこの問題を解決しやすくする場合は、このメソッドに縛られません)

[self performSelectorInBackground:@selector(loadAppInBackground) withObject:self];

バグが原因でバックグラウンドスレッドがクラッシュし(アプリの進化に伴ってさまざまなバグが発生)、プログレスバーが停止することがありますが、ユーザーは何かが間違っていることを明確に示すことができません。

私はこの状況を検出し、ユーザーが待つのをあきらめるまで単にぶら下がるよりも優雅に失敗したいと思います。

ロードプロセスの期間は大きく異なる可能性があるため、単にタイムアウトすることは理想的なオプションではありません。

フォアグラウンドスレッドがバックグラウンドスレッドに障害が発生したことを検出するための最良の方法は何ですか?フォアグラウンドスレッドはUIの処理でビジーなので、最初のスレッドを監視するために2番目のバックグラウンドスレッドが必要ですか?それは醜いようです。

バックグラウンドプロセスを「ping」するために使用できるスレッド間通信メカニズムはありますか?さらに良いことに、他のスレッドのステータスをチェックする低レベルのシステムメカニズムはありますか?

デバッガーは実行中のすべてのスレッドを認識しています...そしてそれらのステータスを認識しているようです。同じことをするために私のアプリで利用できる呼び出しがあるかどうか疑問に思います。

4

3 に答える 3

1

バックグラウンドタスクがある種の定期的なサイクルで実行される場合(たとえば、作業の多くが行われる大きなループがある場合)、フラグを頻繁に設定して、まだ生きていることを示すことができます。

これを行う1つの方法は、バックグラウンドスレッドをどこかに格納[NSDate timeIntervalSinceReferenceDate]し、メインスレッドで、ときどき(おそらくタイマーで)それを現在の時刻と比較することです。差が妥当な制限よりも大きい場合は、バックグラウンドスレッドが停止したと推測できます。

もう1つの方法は、バックグラウンドスレッドにブール値を設定させ、メインスレッドにそれを問い合わせさせ、定期的にクリアさせることです。メインスレッドの問い合わせの間にブール値が再び設定されない場合は、ブール値が停止したと推測できます。

最初の手法には、「合理的な制限」を「調整」して、タイミングがやや不規則なコード(どちらのスレッドでも)を許容できるという利点があります。2番目のアプローチでは、通常、より予測可能なタイミングが必要です。

もちろん、どちらのアプローチでも、バックグラウンドスレッドが終了したばかりで、まだそれを認識していない場合は、「笛を吹く」ことをどうにかして避けたいと思います。

于 2012-10-24T01:37:06.933 に答える
1

一般的な手法は、問題のスレッドのライフサインをチェックするための追加のスレッド(いわゆるハートビートスレッド)を用意することです。ハートビートスレッドは、タイムリーに応答するかどうかをチェックすることでスレッドをポーリングします。応答しない場合は、スレッドが停止していると見なして終了します。

単純なハートビートスレッドの実装は、他のスレッドによって定期的にインクリメントされるカウンターをチェックすることです。カウンターが一定時間内にインクリメントされない場合、カウンターは停止していると見なされ、スレッドの再起動やアプリの強制終了などの適切なアクションを実行できます。もう1つの一般的な方法は、hbスレッドがメッセージをスレッドに送信し、タイムアウトのある応答をチェックする場合です。

于 2012-10-24T04:32:57.313 に答える
0

Objective cには、バックグラウンドスレッドのステータスを直接チェックするメカニズムがないようです。提供された答えはどれもまともなオプションです...タイムアウトするか、スレッドにその継続的な存在のある種の証拠を作成させるかのいずれかです。

もう少しシンプルで信頼性が高く、リアルタイムなものを望んでいました。

スレッドで例外をキャッチし、フォアグラウンドスレッドがリッスンして反応できる「BackgroundThreadException」のような通知を生成することを実験します。

于 2015-08-11T21:11:58.933 に答える