B4J Question Update UI during delay loop

bdunkleysmith

Active Member
Licensed User
Longtime User
I have some code:

Code: Copy
Sub btnFoulLights_Action        ' Enable foul light testing
    If btnFoulLights.Selected Then
            Dim joRect As JavaObject = Rin1TeamFoulsRect
            joRect.RunMethod("setVisible", Array(True))
            Log("1")           
            Wait(2000)   
            Dim joRect As JavaObject = Rin2TeamFoulsRect
            joRect.RunMethod("setVisible", Array(True))           
            Log("2")
            Wait(2000)   
            Dim joRect As JavaObject = Rin3TeamFoulsRect
            joRect.RunMethod("setVisible", Array(True))           
            Log("3")
            Wait(2000)   
            Dim joRect As JavaObject = Rin4TeamFoulsRect
            joRect.RunMethod("setVisible", Array(True))           
            Log("4")
            Wait(2000)   
            Dim joRect As JavaObject = Rin5TeamFoulsRect
            joRect.RunMethod("setVisible", Array(True))           
            Log("5")
            Wait(2000)   
            Dim joRect As JavaObject = Vis1TeamFoulsRect
            joRect.RunMethod("setVisible", Array(True))           
            Log("6")
            Wait(2000)   
            Dim joRect As JavaObject = Vis2TeamFoulsRect
            joRect.RunMethod("setVisible", Array(True))           
            Log("7")
            Wait(2000)   
            Dim joRect As JavaObject = Vis3TeamFoulsRect
            joRect.RunMethod("setVisible", Array(True))           
            Log("8")
            Wait(2000)   
            Dim joRect As JavaObject = Vis4TeamFoulsRect
            joRect.RunMethod("setVisible", Array(True))           
            Log("9")
            Wait(2000)   
            Dim joRect As JavaObject = Vis5TeamFoulsRect
            joRect.RunMethod("setVisible", Array(True))   
            Log("10")
        Else
            Dim joRect As JavaObject = Rin1TeamFoulsRect
            joRect.RunMethod("setVisible", Array(False))           
            Dim joRect As JavaObject = Rin2TeamFoulsRect
            joRect.RunMethod("setVisible", Array(False))           
            Dim joRect As JavaObject = Rin3TeamFoulsRect
            joRect.RunMethod("setVisible", Array(False))           
            Dim joRect As JavaObject = Rin4TeamFoulsRect
            joRect.RunMethod("setVisible", Array(False))           
            Dim joRect As JavaObject = Rin5TeamFoulsRect
            joRect.RunMethod("setVisible", Array(False))           
            Dim joRect As JavaObject = Vis1TeamFoulsRect
            joRect.RunMethod("setVisible", Array(False))           
            Dim joRect As JavaObject = Vis2TeamFoulsRect
            joRect.RunMethod("setVisible", Array(False))           
            Dim joRect As JavaObject = Vis3TeamFoulsRect
            joRect.RunMethod("setVisible", Array(False))           
            Dim joRect As JavaObject = Vis4TeamFoulsRect
            joRect.RunMethod("setVisible", Array(False))           
            Dim joRect As JavaObject = Vis5TeamFoulsRect
            joRect.RunMethod("setVisible", Array(False))   
    End If
End Sub

Sub Wait(ms As Int)
Dim nn As Long = DateTime.Now + ms
Do While DateTime.Now < nn
Loop
End Sub

in which the delay loop is working OK because I can see the number sequence written to the log after each 2 second delay, but each of the rectangles is not made visible in sequence, with all showing together after all delay loops have completed.

How can I make the UI update before each delay loop is called so the rectangles are displayed in sequence?
 
Thanks Erel, but I'm struggling to see how to use a timer.

Can you please point me to an example that uses a timer for the purpose of inserting a delay?

Thanks,

Bryon
 
Upvote 0
Run this code:
Code: Copy
Sub Process_Globals
   Private fx As JFX
   Private MainForm As Form
   Private timer1 As Timer
   Private nodesToHide As List
End Sub

Sub AppStart (Form1 As Form, Args() As String)
   MainForm = Form1
   Dim nodes As List
   nodes.Initialize
   For i = 1 To 10
     Dim b As Button
     b.Initialize("")
     b.Text = i
     MainForm.RootPane.AddNode(b, 40 * i, 50, 30, 30)
     nodes.Add(b)
   Next
   MainForm.Show
   timer1.Initialize("timer1", 2000)
   HideNodesOneByOne(nodes)
End Sub

Sub HideNodesOneByOne (nodes As List)
   timer1.Enabled = True
   nodesToHide = nodes
End Sub

Sub Timer1_Tick
   If nodesToHide.Size = 0 Then
     timer1.Enabled = False
   Else
     Dim n As Node = nodesToHide.Get(0)
     nodesToHide.RemoveAt(0)
     n.SetAlphaAnimated(300, 0)
   End If
End Sub
 
Upvote 0
Thanks again Erel for your great support. As well as solving the particular problem for me, your use of a list of nodes enabled me to simplify some other code in the application.

What I finished up based on your suggestion is:

Code: Copy
Sub Process_Globals
.
.
    Private GameClockRect, RinRect, RinScoreRect, Rin1TeamFoulsRect, Rin2TeamFoulsRect, Rin3TeamFoulsRect, Rin4TeamFoulsRect, Rin5TeamFoulsRect,VisRect, VisScoreRect, Vis1TeamFoulsRect, Vis2TeamFoulsRect, Vis3TeamFoulsRect, Vis4TeamFoulsRect, Vis5TeamFoulsRect As Node
    Private foulLights As List
.
.
End Sub

Sub AppStart (Form1 As Form, Args() As String)
.
.
    foulLights.Initialize
    foulLights.AddAll(Array(Rin1TeamFoulsRect, Rin2TeamFoulsRect, Rin3TeamFoulsRect, Rin4TeamFoulsRect, Rin5TeamFoulsRect, Vis1TeamFoulsRect, Vis2TeamFoulsRect, Vis3TeamFoulsRect, Vis4TeamFoulsRect, Vis5TeamFoulsRect))
.
.
    Timer1.Initialize("Timer1", 2000)
.
.
End Sub
.
.
Sub btnFoulLights_Action        ' Enable foul light testing
    If btnFoulLights.Selected Then
            Timer1.Enabled = True
            foulLightsIndex = 0
        Else
            For i = 0 To 9
                Dim nx As Node = foulLights.Get(i)
                nx.Visible = False
            Next
            Timer1.Enabled = False    
    End If
End Sub

Sub Timer1_Tick            ' Lights each foul light in sequence on each tick for testing
    Dim nx As Node = foulLights.Get(foulLightsIndex)
    nx.Visible = True
    foulLightsIndex = foulLightsIndex + 1
    If foulLightsIndex = 10 Then
        Timer1.Enabled = False
    End If
End Sub
 
Upvote 0
Back
Top