J'écris une application qui doit communiquer avec un appareil connecté via USB. L'application envoie et reçoit des données à tour de rôle à partir de l'appareil selon un calendrier fixe. Tout Rx/Tx se passe dans un thread séparé, sinon l'interface utilisateur serait bloquée. La structure de base ressemble fondamentalement à ceci. (Piscines autorelease et des trucs omis)Comment puis-je quitter [NSRunLoop runUntilDate]?
-(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....];
}
}
}
Après l'envoi de données, le délai d'attente pour les applications soit données à recevoir ou rxTimeoutTimer
au feu qui conduit à la retransmission du paquet. L'opération rx fonctionne puisque les couches sous-jacentes utilisent des appels système async et appelle un gestionnaire rx qui ressemble à ceci.
-(void)receiveData:(NSData*)data{
[rxQueue addObject:data];
[rxTimeoutTimer invalidate]; // cancel timeout
}
est-il un (facile) façon de faire la sortie [runLoop runUntilDate:]
de receiveData:
? Les docs Apple disent que supprimer toutes les sources de minuterie ne garantit pas la sortie du RunLoop. J'ai lu quelque chose à propos de l'appel performSelector:onThread:...
mais cela n'a pas fonctionné ou je n'ai pas compris le point.
Merci.
Ou, sans la variable locale 'runLoop': CFRunLoopStop ([[NSRunLoop currentRunLoop] getCFRunLoop]); – rpj
@rpj: Vous utilisez 'CFRunLoopGetCurrent()' dans ce cas :) – kennytm