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.
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é. –
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