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