2011-03-10 6 views
0

Je suis en faveur d'une application qui implique une communication par port série.mscomm oncomm event

Il existe 32 contrôles MSComm (tableau de contrôle) sur le formulaire. Supposons que des données sont arrivées à l'un des ports de communication alors qu'un autre code du même thread est en cours d'exécution (par exemple accès à la base de données, etc.). la procédure d'événement Oncomm sera-t-elle demandée pour l'exécution ou le point d'exécution actuel est-il appelé et le gestionnaire d'événement Oncomm est-il exécuté?

+0

Je ne suis pas vraiment sûr si je comprends ce que vous demandez ... Oui, l'événement de communication sera mis en file d'attente; le code de votre gestionnaire d'événements ne sera pas exécuté tant que le thread n'aura pas terminé ce qu'il est en train de faire. Votre accès à la base de données ne sera pas préempté. –

+1

Certaines opérations de base de données peuvent également être effectuées de manière asynchrone. Il ne s'agit pas tant de «terminer le processus» que de renvoyer le code à la boucle de messages du programme. Dans VB6, cela signifie quitter le gestionnaire d'événements en cours. – Bob77

Répondre

1

VB6 est un filetage unique. Fondamentalement (à l'exception des contrôles ActiveX pour une seconde), il y a juste le thread graphique.

Il est assis là en attente d'un événement. Vous obtenez des données, donc il entre dans le gestionnaire d'événements pour votre contrôle MSComm et commence à faire un peu d'accès à la base de données. Il bloque l'attente de la réponse de la base de données. Un autre contrôle MSComm reçoit des données et déclenche un événement. Cet événement se trouve simplement dans la file d'attente des événements Windows. Le thread graphique doit quitter le gestionnaire d'événements avant de pouvoir traiter l'autre événement MSComm.

Bien sûr, au milieu d'un gestionnaire d'événements, vous pouvez appeler DoEvents. Je vous suggère fortement de le faire rarement, voire jamais. C'est la source de nombreux bugs difficiles, selon mon expérience.

Il y a ways de faire la queue le long travail de base de données en cours d'exécution sur un thread d'arrière (en utilisant un appel en code géré .NET, dans ce cas). Cela permettra à votre code de gestionnaire d'événements de continuer presque immédiatement sans bloquer, lui permettant de traiter le message suivant. À ma connaissance, il n'y a pas de moyen VB6 natif pour le faire.

+0

Salut scott, quels sont les effets secondaires de l'appel DoEvents (je l'utilise en fonction Delay) ?. Si nous n'appelons pas DoEvents, le fil bloque l'OS.Am je raison? – ramu

+1

@ramu - le système d'exploitation n'est pas bloqué. Comme je l'ai dit, dans VB6 il y a un thread graphique principal. Ce thread peut bloquer n'importe quel appel de tâche ou de fonction en cours d'exécution. Une fois que vous avez exécuté un long appel de fonction, vous ne pouvez pas appeler DoEvents de toute façon, cela ne vous aidera donc pas. Ce que cela vous permet de faire est de suspendre l'exécution d'un gestionnaire d'événements afin de traiter d'autres événements. Habituellement, c'est le signe d'un design mal conçu. Vous pouvez normalement remplacer ceci par un 'Timer' (votre Delay inclus) qui exécute périodiquement le travail que vous voulez, puis quitte son gestionnaire d'événements quand il n'a plus de travail. –