J'essaye de (re) écrire un programme utilisant des scanners contrôlés par USB. J'ai mon USBIOInterfaceInterface
mis en place, donc je peux envoyer et recevoir des messages sur les tuyaux. J'appelle avec succès WritePipeTO
et ReadPipeTO
de manière synchrone, mais je veux lire à partir du scanner de manière asynchrone.Exemple de code Mac utilisant USB et CFRunLoopSource
J'ai essayé d'utiliser ReadPipeAsyncTO
, mais le rappel n'est jamais appelé avant l'expiration du délai d'appel. La raison semble être que je ne suis pas en train d'enregistrer le rappel quelque part. Si j'ajoute un CFRunLoopRun
après la lecture asynchrone, alors il semble fonctionner, mais seulement en ayant de nombreux appels imbriqués à CFRunLoopRun
, ce qui ne peut pas être une bonne idée.
J'ai vu les fonctions:
err = (*usbInterfaceInterface)->CreateInterfaceAsyncEventSource(usbInterfaceInterface, &cfSource);
CFRunLoopAddSource(CFRunLoopGetCurrent(), cfSource, kCFRunLoopDefaultMode);
mais je n'ai pas compris comment dire la source ce rappel devrait être appelé quand quelque chose se passe sur cette interface. Lorsque je viens de créer la source, et appeler le ReadPipeAsyncTO
, le rappel ne sera pas appelé avant le délai.
Y a-t-il quelque part le même code d'échantillon pour que je puisse voir comment ces fonctions sont SUPPOSÉES pour fonctionner ensemble?
Pouvez-vous me donner un pointeur vers un exemple de code qui fait cela? Je suis certainement ouvert aux suggestions. Le code original utilisait une fonction obsolète de 20 ans (GetNextEvent) donc un changement d'architecture est probablement en ordre de toute façon ... –
Utilise la boucle d'exécution correctement? Toute application Cocoa qui n'appelle pas directement 'CFRunLoopRun' ou' - [NSRunLoop run ...] '(ou, tant que nous y sommes,' - [NSApplication nextEvent ::::] ') est qualifiée. La boucle d'exécution est là de toute façon, et l'application est construite dessus, donc tout ce que vous avez à faire est de planifier l'opération asynchrone, puis finir, retourner, et laisser revenir à vous dans son temps. –
Les chances sont, vous essayez de configurer la connexion avant que votre boucle d'exécution est en cours d'exécution. Vous ne pouvez pas le faire avec une boucle d'exécution de Foundation, bien que vous puissiez en tirer parti en utilisant une boucle d'exécution de base de base, c'est pourquoi les choses fonctionnent à mi-chemin pour vous. Au lieu d'initialiser votre code avant le démarrage de votre boucle d'exécution principale, initialisez-le dans le cadre d'une routine déjà exécutée dans une boucle d'exécution. Ensuite, ReadPipeAsync [TO] devrait fonctionner comme prévu. En outre, n'utilisez pas un délai d'attente si vous pouvez l'aider. – dgatwood