0

娘を楽しませるために、WinMo 6.x 用の簡単なアプリケーションを作成しました。動物の画像と動物のノイズのペアのセットを保持し、画像の 1 つをランダムに表示します。画像をクリックすると動物の鳴き声が聞こえ、2 歳児は気が散ってしまいます :-) そして次の画像が表示されます。

ただし、彼女は画面を叩く傾向があるため、実際の流れは、画像が表示されて数回クリックすることです。いくつかの動物の鳴き声が再生された後、画像が次のランダムな動物に変わります。

私の推測では、プログラムがノイズを再生してブロックしている間に、OS がクリック イベントをキューに入れ、できるだけ早くそれらを処理していると思われます。マシンがハングし、すべてが再びクリアされたときにテキストが表示される間、入力を続けることができるのとほぼ同じ方法です。

したがって、フォームには2つの変数があります

Private thisCollectionOfThings As ObjectStore
Private currentObject As RealWorldObject

ObjectStore は、特定のペアが最近返されていないことを確認して、ランダムな RealWorldObject を返す getNextObject メソッドを持つ List(Of 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. そのブール値がtrueの場合、クリックハンドラーの画面タップは無視してください。
于 2010-03-23T13:44:41.120 に答える