Обрабатывать событие Windows Mobile Click, чтобы оно не «ставилось в очередь», пока моя программа блокирует - PullRequest
0 голосов
/ 23 марта 2010

Я написал простое приложение для WinMo 6.x, чтобы развлечь мою дочь.Он содержит набор изображений животных для пар шумов животных и случайным образом отображает одно из изображений.При нажатии на изображение звуки животных воспроизводятся, а двухлетний ребенок отвлекается :-), а затем отображается следующее изображение.

Однако, поскольку она стремится ударить по экрану, фактическим потоком является то, что изображениепоказывает и она щелкает несколько раз;воспроизводится несколько звуков животных, а затем изображение меняется на следующее случайное животное.

Я предполагаю, что ОС ставит в очередь события щелчка, в то время как программа блокирует, так как она воспроизводит шум, а затем обрабатывает их, как толькооно может.Почти так же, как вы можете продолжать печатать, когда ваша машина зависает, и текст отображается, когда все снова очищается.

Таким образом, форма имеет две переменные

Private thisCollectionOfThings As ObjectStore
Private currentObject As RealWorldObject

ObjectStore - это класс-оболочкавокруг списка (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

Вы можете заметить, что я прибег к попытке удалить обработчик событий, чтобы попытаться избежать проблемы с очередью кликов, но она не работает.

Любой совет о том, как этого избежать, был бы очень признателен... В противном случае я попытаюсь написать свою собственную обертку вокруг элемента управления графическим блоком, чтобы попытаться обработать щелчок, но я не хочу тратить свое время, если чужой опыт подсказывает, что это не поможет.

1 Ответ

1 голос
/ 23 марта 2010

Я бы пошел для простоты (KISS):

  1. Используйте логическое значение, называемое чем-то вроде «IsPlaying», и установите его в true прямо перед тем, как воспроизводить звук, и false после его завершения.
  2. Поместите воспроизводимое аудио в фоновый поток, чтобы пользовательский интерфейс оставался отзывчивым.
  3. Если это логическое значение true, игнорировать нажатия экрана в обработчике кликов.
...