0

我为 WinMo 6.x 编写了一个简单的应用程序来娱乐我的女儿。它拥有一组动物图像到动物噪声对,并随机显示其中一个图像。单击图像时,会播放动物噪音,两岁的孩子会分心:-),然后显示下一张图像。

然而,由于她倾向于在屏幕上猛击,实际流程是图像显示并且她点击了几次;播放几个动物噪音,然后图像变为下一个随机动物。

我的猜测是操作系统正在排队点击事件,而程序在播放噪音时阻塞,然后尽快处理它们。就像您可以在机器挂起时继续打字一样,当一切再次清除时显示文本。

所以表单有两个变量

Private thisCollectionOfThings As ObjectStore
Private currentObject As RealWorldObject

ObjectStore 是一个围绕 List(Of RealWorldObject) 的包装类,它有一个 getNextObject 方法,该方法返回一个随机的 RealWorldObject,该方法检查了最近没有返回特定对。

在我们的表格中...

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

您可以看到我已尝试删除事件处理程序以尝试避免单击排队问题,但它不起作用。

任何关于如何避免这种情况的建议都将受到高度赞赏......否则我会尝试在图片框控件周围编写自己的包装器来尝试处理点击,但如果其他人的经验表明我不愿意用完我的时间那不会有帮助的。

4

1 回答 1

1

我会为了简单起见(KISS):

  1. 使用名为“IsPlaying”之类的布尔值,并在播放声音之前将其设置为 true,在播放完成后将其设置为 false。
  2. 将音频播放在后台线程中,以便 UI 保持响应。
  3. 如果该布尔值为真,则忽略点击处理程序中的屏幕点击。
于 2010-03-23T13:44:41.120 回答