2010-03-23 76 views
0

我已經寫了的Windows Mobile 6.x的一個簡單的應用程序來招待我的女兒。它擁有一組動物圖像以及動物噪聲對,並隨機顯示其中一幅圖像。當圖片被點擊時,動物噪聲會播放,兩歲的孩子會分心:-)然後顯示下一張圖片。處理Windows Mobile的Click事件,使其不「排隊」,而我的程序阻止

然而,因爲她往往在屏幕打壞實際流量是圖像顯示和她點擊數次;播放幾個動物噪聲,然後圖像變成下一個隨機動物。

我的猜測是,操作系統正在排隊的點擊事件,而該計劃是阻止,因爲它扮演的噪音,然後只要它能夠處理它們。就像您可以在機器掛起時進行打字一樣,而當一切再次清除時文本都會顯示。

所以窗體上有兩個變量

Private thisCollectionOfThings As ObjectStore 
Private currentObject As RealWorldObject 

ObjectStore的是圍繞一個列表(中RealWorldObject)的包裝類具有getNextObject方法返回一個隨機RealWorldObject已經檢查了particluar對最近沒有被退回。

在我們的形式...

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 

你可以看到我已經使出嘗試刪除的事件處理程序,以儘量避免點擊排隊問題,但它無法正常工作。

任何關於如何避免這種情況的建議將被超讚賞......否則,我會嘗試在圖片框控件周圍編寫我自己的包裝來嘗試處理點擊,但我厭惡用盡我的時間if別人的經驗表明,這將無濟於事。

回答

1

我會去簡單(KISS):

  1. 使用名爲類似「IsPlaying模塊」,並將其設置爲true的權利,你播放的聲音和假之前它完成後一個布爾值。
  2. 將音頻播放到後臺線程中,以便UI保持響應。
  3. 如果該布爾值爲true,則忽略點擊處理程序中的屏幕點擊。
+0

對不起,本來應該更清晰......我最初的做法是正是......但我與添加/刪除處理時不工作取而代之。 我想你是對的,我應該把音頻放入一個單獨的線程,而不是懶惰。 其實我猜你是完全正確的。由於我的猜測是這個問題是由於UI沒有反應,我應該修復這個問題。 – 2010-03-23 18:47:53

+0

如果沒有線程,布爾值將不會執行任何操作,因爲操作系統會將點擊事件排在您的應用程序之前的很長時間。刪除事件處理程序沒有用處也是一樣的原因。 – ctacke 2010-03-23 19:53:08

+0

昨晚在線程中彈出,它幾乎解決了這個問題。多次點擊的尾巴仍然被挑選出來(我猜測用戶界面在從線程中取回控制時會暫時阻止),所以我添加了一個定時器,當線程返回時自動停止並將isPlaying標誌設置爲false 。我現在想要的一切都很快。謝謝你提醒我KISS – 2010-03-29 12:05:25

相關問題