2010-03-23 1 views
0

J'ai écrit une application simple pour WinMo 6.x pour divertir ma fille. Il contient un ensemble d'images animales à des paires de bruit d'animaux et affiche aléatoirement l'une des images. Lorsque l'image est cliquée, le bruit des animaux joue et l'enfant de deux ans est distrait :-) et l'image suivante est affichée. Cependant, comme elle a tendance à frapper à l'écran, le flux réel est celui que l'image affiche et elle clique plusieurs fois; plusieurs bruits d'animaux sont joués, puis l'image change pour l'animal aléatoire suivant. Je suppose que le système d'exploitation met en file d'attente les événements click pendant que le programme bloque lorsqu'il lit le bruit, puis les traite dès que possible. De la même manière que vous pouvez continuer à taper pendant que votre machine se bloque et que le texte s'affiche lorsque tout s'efface de nouveau.Gestion de l'événement Windows Mobile Click pour qu'il ne soit pas en file d'attente pendant que mon programme bloque

Ainsi, le formulaire a deux variables

Private thisCollectionOfThings As ObjectStore 
Private currentObject As RealWorldObject 

ObjectStore est une classe wrapper autour d'une liste (de RealWorldObject) qui a une méthode getNextObject qui retourne une RealWorldObject aléatoire ayant vérifié cette paire particluar n'a pas été retourné récemment .

Dans la forme que nous avons ...

Private Sub picBox_Click(ByVal sender As Object, ByVal e As EventArgs) 
      RemoveHandler picBox.Click, AddressOf picBox_Click 
      picBox.BackColor = Color.Gray 
      If currentObject.getSoundLocation() <> "" Then 
       currentObject.playSound() 
       refreshScreen() 
      End If 
End Sub 

Private Sub refreshScreen() 
    picBox.Image = Nothing 
    currentObject = thisCollectionOfThings.getNextObject() 
    If Not currentObject Is Nothing Then addImage() 
    AddHandler picBox.Click, AddressOf picBox_Click 
End Sub 

Private Sub addImage() 
    picBox.Image = New Bitmap(currentObject.getImageLocation()) 
End Sub 

Vous pouvez voir que j'ai eu recours à essayer de supprimer le gestionnaire d'événements pour essayer d'éviter le problème, cliquez faire la queue, mais il ne fonctionne pas. Tout conseil sur la façon d'éviter ce serait super apprécié ... Sinon, je vais essayer d'écrire mon propre emballage autour du contrôle de la boîte d'image pour essayer de gérer le clic, mais je déteste utiliser mon temps si l'expérience de quelqu'un d'autre suggère que cela n'aiderait pas.

Répondre

1

Je vais pour la simplicité (Kiss):

  1. Utilisez une valeur booléenne appelée quelque chose comme « isPlaying » et le mettre à vrai droit avant de jouer le son et faux après qu'il a fait.
  2. Mettez l'audio en cours de lecture dans un fil d'arrière-plan pour que l'interface utilisateur reste active.
  3. Si ce booléen est vrai, ignorez les captures d'écran dans le gestionnaire de clics.
+0

Désolé, aurait dû être plus clair ... mon approche initiale était exactement cela ... mais je l'ai remplacé par le gestionnaire d'ajout/suppression lorsque cela ne fonctionnait pas. Je suppose que vous avez raison de dire que je devrais mettre l'audio dans un fil séparé au lieu d'être paresseux. En fait, je suppose que vous avez tout à fait raison. Depuis mon estimation est que le problème est dû à une interface utilisateur qui ne répond pas, je devrais être en train de corriger cela. –

+0

Sans le thread, le booléen ne fera rien, car le système d'exploitation mettra en file d'attente les événements de clic longtemps avant qu'ils ne soient transférés à votre application. C'est la même raison pour laquelle supprimer le gestionnaire d'événements ne sert à rien. – ctacke

+0

a surgi dans le filetage hier soir et il a presque résolu le problème. La queue de plusieurs clics a été ramassée (je suppose que l'IU bloquait brièvement car elle a pris le contrôle du thread), j'ai donc ajouté une temporisation qui a démarré lorsque le thread est revenu et a replacé le drapeau isPlaying sur false . Tout va bien comme je veux maintenant. Merci de me rappeler à KISS –

Questions connexes