2009-10-07 9 views
1

J'utilise le TIdTCPServer d'Indy (D2009, Indy 10) pour communiquer avec les applications client. Dans la méthode OnExecute, je crée une tâche et la file d'attente. Un thread de travail exécute la tâche et la place dans la file d'attente d'envoi. La file d'attente d'envoi envoie ensuite la réponse au client.Indy, envoyer des threads et des contextes détruits

Dans le thread d'envoi, je parcours la liste de contextes du serveur et recherche le contexte correspondant aux informations IP et de port stockées dans la tâche. Ensuite, suivez un certain nombre de commandes d'envoi qui lancent parfois des violations d'accès (je suppose que le contexte est détruit lors de l'envoi).

Maintenant à la question: comment puis-je m'assurer que le contexte n'est pas fermé avant d'avoir envoyé la réponse? Est-il possible avec Indy d'envoyer à partir d'un fil séparé ou tout devrait-il être fait dans le fil d'Indy?

Répondre

2

Vous pouvez essayer de conserver la liste TIdTCPServer.Contexts verrouillée pendant que vous envoyez des données, car le contexte n'est pas libéré avant d'avoir été supprimé de la liste. L'inconvénient est qu'aucun client ne se connecte/déconnecte/envoie sera traité tant que cet envoi est en cours. Sinon, il vous suffit d'enrouler votre code d'envoi dans un bloc try/except et d'ignorer les erreurs qui pourraient survenir. Sinon, si vous pouvez réécrire votre code pour déplacer la file d'attente d'envoi dans le contexte lui-même, ce serait mieux, oui. Ensuite, votre gestionnaire d'événement OnExecute pourrait vérifier la file d'attente périodiquement et envoyer des données lorsque disponibles. Cela vous aidera également en termes de performances, car vous ne numéroterez plus vos envois si vous disposez de données sortantes prêtes pour plusieurs clients en même temps.

+0

Encore Merci! Je pense à la restructuration et à mettre tout le code de communication dans OnExecute. – jpfollenius

Questions connexes