In a previous post I advertised an application I'd made for WinMo to entertain my toddler.
Having watched her play with it and having been reminded to K.I.S.S. I've fixed a bug that highlighted the difference in expectations between myself and a toddler.
No not the world-weary pessimism I'm practising instead when I tested and used the app I would click and then wait for something to happen… whereas my toddler would bash at the screen having got the link between doing so and stuff happening.
While the UI was blocking the OS would register all the clicks and then process them before updating the screen.
In the context of this application that meant that you could have a sheep on screen that was barking like a dog…. not teaching my kid the lessons I was hoping!
I moved the actual sound playing onto a background thread and set a boolean flag to try to control the click event
Private Sub picBox_Click(ByVal sender As Object, ByVal e As EventArgs) Handles picBox.Click
If Not isPlaying Then
isPlaying = True
Dim t As Threading.Thread = New Threading.Thread(New Threading.ThreadStart(AddressOf playSound))
t.Start()
t.Join()
'playSound has finished now so...
refreshScreen()
End If
End Sub
Private Sub playSound()
If currentObject.getSoundLocation() <> "" Then
currentObject.playSound()
End If
End Sub
Private Sub refreshScreen()
picBox.Image = Nothing
currentObject = thisCollectionOfThings.getNextObject()
If Not currentObject Is Nothing Then addImage()
playTimer.Enabled = True
End Sub
Private Sub playTimer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles playTimer.Tick
playTimer.Enabled = False
isPlaying = False
End Sub
The astute among you (pat yourselves on the back) will notice that there's also a timer in there… I found that if I hit the screen 5 times (for example) during the sound playing the last one or two clicks would be picked up and their audio played before the image finally refreshed.
I guess the UI was blocking briefly as processing control passed from the spawned thread back to the UI thread.
So I added a short timer that is started by the refreshScreen
method and which stops itself and resets the isPlaying
flag on its first tick.
That might be a bit hacky and there might be a better way but since that seems to work I'm happy with it.
And now I have a slightly more toddler-proof toddler game.
At the time of writing you could view all of the source code and download an install cab at codeplex qqstd.codeplex.com
but that site is unavailable now :( You can see it in the wayback machine