2 votes

Access 2003 VBA Form_Timer ne se déclenche pas pendant le déplacement de la souris

Je veux attraper un événement Form_Timer répété de 500 ms pendant le déplacement de la souris. C'est-à-dire entre les événements "mouse down" et "mouse up". L'événement Timer se déclenche à l'extérieur du déplacement mais pas à l'intérieur.

La raison de l'événement de la minuterie est que le programme effectue un traitement important pendant le déplacement de la souris et souvent ne saisit pas la position la plus récente de la souris - après avoir saisi l'événement de la minuterie, le programme peut interroger la position actuelle de la souris. [Par exemple, l'utilisateur peut avoir fait glisser la souris rapidement dans une position qui n'est pas signalée par MouseMove, puis maintenir le déplacement à cet endroit.]

Quelqu'un d'autre a-t-il eu ou résolu ce problème ?

J'en ai fait l'expérience sur Windows XP Pro SP3 et Windows 7 Starter.

1voto

Giuseppe R Points 1325

En effet, tous les événements de l'interface graphique s'exécutent sur un seul "fil d'envoi d'événements", et les événements de manipulation de la souris par glisser-déposer provoquent la mise en file d'attente du minuteur. Les événements sont en fait des messages de fenêtre et les gestionnaires de messages doivent être appelés à partir d'un seul thread. Le déplacement de la souris maintient le thread d'événement "occupé", de sorte qu'il ne peut exécuter aucune autre procédure de fenêtre pendant le déplacement. Il s'agit de l'une des limites de conception des interfaces graphiques natives de Windows, dont Access 2003 est l'un des programmes qui l'utilisent.

La gestion des entrées et le modèle de threading ont été améliorés dans les versions plus récentes de Windows et avec des frameworks différents, comme celui utilisé dans Office 2010. Je ne sais pas si cela résout votre problème, mais il pourrait être utile d'essayer une nouvelle version d'Office.

Une autre chose que vous pouvez essayer est d'exécuter une boucle occupée qui appelle DoEvents de temps en temps pour traiter les messages de la fenêtre, et utilisez simplement les sleeps pour chronométrer les interruptions de 500 ms plutôt que de demander au système d'appeler votre événement toutes les 500 ms.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X