2011-02-01 1 views
1

J'ai une application C# par laquelle je configure les paramètres d'une caméra Ethernet. L'appareil photo agit en tant que serveur et l'application agit en tant que client.L'arrière-plan ne fonctionne pas

Il y a 2 prises de communication, une pour la communication de données/commande - prise de données (communication bidirectionnelle) et une autre prise pour l'image, la caméra envoie l'image via la prise d'image. La caméra enverra l'image via la prise d'image chaque fois qu'un déclencheur matériel lui est donné (non prévisible quand le déclencheur matériel viendrait).

L'utilisateur peut configurer la caméra en modifiant les valeurs dans l'interface graphique. Lorsque l'utilisateur modifie un paramètre, les applications envoient la commande et les données à la caméra via le socket de commande et attendent une réponse (le délai de réception est de 5 secondes). La caméra reçoit la commande et renvoie la réponse. L'interface graphique le reçoit met à jour l'utilisateur qui a été mis à jour avec succès. Une boucle infinie à l'intérieur maintient l'interrogation de l'image dans le socket de l'image et à chaque réception de l'image, elle est affichée dans l'interface graphique (j'utilise un délégué pour faire cela). Tout va bien :)

Maintenant, quand un déclencheur est venu à la caméra, il enverrait l'image. Au même instant, l'utilisateur change un paramètre, l'application envoie la commande/les données et attend la réponse. La caméra ne recevra la commande qu'après avoir envoyé l'image complètement. Ce qui se passe, c'est que l'arrière-plan (qui reçoit l'image) n'est pas en cours d'exécution lorsque l'application attend la réponse pour la commande. Ainsi, l'interface utilisateur attend la réponse dans le socket de commande et la caméra envoie l'image dans le socket de l'image et l'interface utilisateur ne reçoit pas l'image car le worker ne fonctionne pas. Il devient un interblocage et le délai d'attente (5 sec) se produit à la commande socket :(

Pourquoi l'arrière-plan ne fonctionne pas lorsque le socket attend le délai d'attente? J'ai remplacé l'arrière-plan travailleur par thread et je définis la priorité comme le plus élevé. l'erreur (délai d'attente) fréquence a diminué, mais le même problème se produit occasionaly. Qui de vous les gars me aider à trier cela et me aider à comprendre le problème.

Merci, Vishnu

Répondre

1

Je vous suggère de vous assurer que le délégué utilisé pour actualiser l'image de l'arrière-plan est appelé de manière asynchrone (en utilisant BeginInvoke). L'invocation synchrone peut provoquer l'inter-verrouillage.

+0

Cela a fonctionné. Merci Johnan Bias. – Vishnu

0

Sans y voir le Le code est un peu difficile à comprendre, mais je soupçonne que le problème est lié à l'interface utilisateur de l'application qui se bloque en attente d'une réponse

Quel thread attend-il après l'envoi d'une commande? Si c'est le thread de l'interface utilisateur qui est un mauvais design - le thread de l'interface utilisateur ne devrait jamais avoir besoin d'attendre quoi que ce soit.

Créez un autre thread utilisé pour communiquer via le socket de commande/de données. L'interface utilisateur peut simplement mettre des commandes dans un ConcurrentQueue<T> ou BlockingCollection<T>. Le thread qui possède le socket de données consomme des commandes de la file d'attente, les envoie à la caméra, attend jusqu'à cinq secondes, puis renvoie un message à l'interface utilisateur (en utilisant Invoke). Ce thread sérialisera tous les accès à la socket de commande/données pour s'assurer qu'une seule commande est active à la fois.

+0

Merci pour la réponse. Je vais essayer cette approche que vous avez suggérée et revenir. Comme vous l'avez dit, socket de commande attend dans le thread UI. – Vishnu

+0

J'utilise VS2008. Y a-t-il un moyen de faire cela? – Vishnu