Nous développons C++ application pour Windows, en utilisant le code Borland vitesse 2007.problème « utilisateurs définis et des messages de fenêtre » dans un fil
L'application principale n'a qu'un seul fil (ce qui est une restriction forte). À partir de ce fil:
1) Un formulaire est créé (VCL de Borland).
2) Les messages sont reçus à la fois:
a. Messages from the window: messages including Windows mouse events, etc. (Form).
b. Our own pre-defined messages
3) Le formulaire est utilisé dans une application en temps réel (y compris un appareil photo), de sorte que ce fil reçoit les utilisateurs définis et des messages de fenêtre.
4) Le thread doit traiter TOUS les messages, donc nous ne pouvons pas en éliminer (filtrer) aucun.
Le problème est:
En ce moment, lorsque l'utilisateur clique sur la souris (sur le formulaire) et la maintenir enfoncée, les verrous d'application. Les événements de la souris ont une haute priorité que nos propres messages, de sorte que le thread continue de traiter les événements de souris (jusqu'à ce que l'utilisateur relâche la souris). En attendant, l'autre type de Messages ne sont pas traités en raison de l'inondation des messages de la souris, de sorte que la caméra se verrouille.
Une idée sur la façon de résoudre ce problème? Notre principale contrainte est de traiter les priorités de messages dans un seul thread : il semble que les messages Windows arrivent toujours avec la priorité plus élevée.
Ci-dessous vous trouverez un code illustrant notre approche:
================================================================
FThread(LPVOID owner) {
...
...
form->CreateViewController();
if(form)
form->Show();
while(
(new_event = MsgWaitForMultipleObjects(size, events, false, INFINITE, QS_ALLINPUT))
!= (WAIT_OBJECT_0 + 1)) {
new_event = new_event - WAIT_OBJECT_0;
if(new_event >= 2 && new_event!= size)
ResetEvent(events[new_event]);
if (new_event < size) {
try{
form->processMyMessages(new_event);
}
catch (Exception &ex) { }
}
if (new_event == size) {
MSG msg;
while(PeekMessage(&msg, 0, 0, 0, true)) {
TranslateMessage(&msg);
DispatchMessage (&msg);
}
}
}
...
...
return 0;
}