2

私はobjective-cでsshラッパーを書いていますが、コマンドの実行に必要なmaxTimeを実装しようとしています。私がそれを実装する方法は次のとおりです。

メインスレッド:

  1. タイムアウトを計算する
  2. コマンドを実行して返されたデータを解析するためのasyncThread(GCDキュー)を作成します
  3. waitForTimeoutOrSignal
  4. 結果を返す

AsyncThread:

  1. コマンドを実行する
  2. 返されたデータを取得する
  3. 正しいデータ信号を受信した場合MainThread

C#では、ManualResetEventsを使用してMainThreadに信号を送ることに成功しました。Objective-Cで私が見つけることができる最も近いクラスはNSConditionですが、スレッド間通信用に構築されていないようです。

実際、私は次のようになります。

2012-05-22 00:31:05.761 libssh2-for-iOS [60821:11303] **-[NSConditionunlock]:条件('(null)')がロックされなかったスレッドからロック解除されました

2012-05-22 00:31:05.763 libssh2-for-iOS [60821:11303] **デバッグするには_NSLockError()を中断します。

使ってみると。NSConditionを使用する別の方法、またはスレッドが何らかの信号を受信するまでスリープするためのより良い方法はありますか?

4

1 に答える 1

5

わかりました、私はほとんど正しかったことがわかりました。私の問題は(コンパイラーが手軽にほのめかしているように)、あるスレッドでロックし、別のスレッドでロックを解除していたことでした。それを本当に解決したのは、NSConditionの「シグナル」メソッドについて学ぶことでした。だから今、私はこのようにコードを書き直しました:

ワーカー#1スレッド:

[NSCondition lock]
start worker thread
if([NSCondition waitUntil:maxTime])
    // got signal
else
    // timed out
[NSCondition unlock]

ワーカー#2スレッド:

Do work
[NSCondition signal]
于 2012-05-23T03:46:52.980 に答える