USB 経由で接続されたデバイスと通信する必要があるアプリケーションを作成しています。アプリは決まったタイミングでデバイスから順番にデータを送受信します。そうしないと UI がブロックされるため、すべての Rx/Tx は別のスレッドで発生します。基本的な構造は基本的にこのようになります。(自動解放プールなどは省略)
-(void)comThread:(id)arg {
while(state == kIsConnected) {
// let timers run
[runLoop runUntilDate:[NSDate distantFuture]];
// handle data
if(rxTxState == kRx) {
// do some stuff to pass data to upper layers
rxTxState = kTx;
}
if(rxTxState == kTx) {
// do some stuff to send data
rxTimeoutTimer = [NSTimer scheduledTimer....];
}
}
}
データを送信した後、アプリはデータが受信されるかrxTimeoutTimer
、パケットの再送信につながる起動するのを待ちます。基礎となるレイヤーが非同期システムコールを使用し、基本的にこのように見えるrx-handlerを呼び出すため、rx操作は機能します。
-(void)receiveData:(NSData*)data{
[rxQueue addObject:data];
[rxTimeoutTimer invalidate]; // cancel timeout
}
[runLoop runUntilDate:]
から抜け出す(簡単な)方法はありreceiveData:
ますか?Apple のドキュメントによると、すべてのタイマー ソースを削除しても、RunLoop が終了する保証はありません。電話について何か読んだことperformSelector:onThread:...
がありますが、うまくいかなかったか、要点がわかりませんでした。
ありがとう。