2009-09-15 6 views
0

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; 
} 

Répondre

1

Je ne pense pas qu'il y ait une planification fait sur les messages, il est probablement juste que si la souris faire quelque chose, il sera causnig votre code pour gérer ses actions. Puisque vous n'avez qu'un seul thread, il verrouille votre caméra comme vous l'avez suggéré.

Vous pourriez être en mesure de faire quelque chose pour céder le contrôle temporairement afin de permettre le traitement d'autres messages.

S'appuyer sur la pompe de messages Windows pour mettre à jour l'affichage n'est probablement pas la meilleure solution dans ce cas. Personnellement, je suggère d'exécuter le code de la caméra dans un thread d'arrière-plan afin que votre interface graphique reste sensible sans nuire à votre processus de capture de données.

[Modifier] Il me semble (de votre indenter) qu'il devrait être un « { » entre les lignes suivantes:

if(new_event >= 2 && new_event!= size) 
    ResetEvent(events[new_event]); 
0

Le code que vous avez posté semble correct. Je ne vois aucun problème dans ce code. De plus, je n'ai aucune idée du message que vous recevez.

De plus, vous avez un problème de conception fondamental. Votre soi-disant "Application en temps réel" DOIT utiliser plusieurs threads. Il n'y a pas d'alternative réaliste: la priorité Windows est une propriété de thread, pas une propriété de message.

Questions connexes