• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 193
  • Last Modified:

Do Until with a timer issues...

I am working on some code that contains a Do Until statement that continually pings a computer until it comes online or the timer reaches 5 seconds. The reason I want it to wait and keep trying is that a previous script attempted to power on the computer. The problem I'm running into, is that the timer doesn't seem to do anything unless I put a msgbox in the loop statement. Only then does the timer do anything with the counter variable. I'd much rather I didn't have to continually click OK until it's done. Ideas?
Private Sub BackgroundWorker4_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker4.DoWork
 
            ifonline1 = 0
 
            counter = 0
 
            InitializeTimer()
            MsgBox("Attempting to power on " & strcomputer)
            Do Until ifonline1 = 1 Or counter >= 5
 
                On Error Resume Next
                Dim Ping As New Net.NetworkInformation.Ping
                Dim PingOptions As New Net.NetworkInformation.PingOptions
                PingOptions.Ttl = 64
                Dim PingReply As Net.NetworkInformation.PingReply = Ping.Send(strcomputer, 200)
                If PingReply.Status = Net.NetworkInformation.IPStatus.Success Then
                    ifonline1 = 1
                    flag4 = "ON"
                Else
                    ifonline1 = 0
                    flag4 = "OFF"
                End If
 
            Loop
            MsgBox(flag4)
            If ifonline1 = 1 Then
                Dim Host As Net.IPHostEntry = Net.Dns.GetHostEntry(strcomputer)
                Dim firstaddress As Net.IPAddress = Host.AddressList(0)
                ip = firstaddress.ToString
                
            End If
            flag1 = pc3
            flag2 = ip
            flag3 = rownum
            worker.ReportProgress(prog1)
        Next
 
End Sub
 
Private Sub InitializeTimer()
        ' Run this procedure in an appropriate event.
        counter = 0
        Timer1.Interval = 1000
        Timer1.Enabled = True
    End Sub
 
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
 
        If counter >= 6 Then
            ' Exit loop code.
            Timer1.Enabled = False
            counter = 0
        Else
            'MsgBox(counter)
            ' Run your procedure here.
            ' Increment counter.
            counter = counter + 1
        End If
 
    End Sub

Open in new window

0
jcamping
Asked:
jcamping
1 Solution
 
Mike TomlinsonMiddle School Assistant TeacherCommented:
I would just get rid of the Timer altogether and add the timing logic directly into your loop.

Here is the big change:

            Dim endTime As DateTime = DateTime.Now.AddSeconds(5)
            Do Until ifonline1 = 1 OrElse DateTime.Now.Subtract(endTime).TotalMilliseconds > 0

See full code below:
        Private Sub BackgroundWorker4_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker4.DoWork
            ifonline1 = 0
            MsgBox("Attempting to power on " & strcomputer)
 
            Dim endTime As DateTime = DateTime.Now.AddSeconds(5)
            Do Until ifonline1 = 1 Or DateTime.Now.Subtract(endTime).TotalMilliseconds > 0
 
                On Error Resume Next
                Dim Ping As New Net.NetworkInformation.Ping
                Dim PingOptions As New Net.NetworkInformation.PingOptions
                PingOptions.Ttl = 64
                Dim PingReply As Net.NetworkInformation.PingReply = Ping.Send(strcomputer, 200)
                If PingReply.Status = Net.NetworkInformation.IPStatus.Success Then
                    ifonline1 = 1
                    flag4 = "ON"
                Else
                    ifonline1 = 0
                    flag4 = "OFF"
                End If
            Loop
            MsgBox(flag4)
            If ifonline1 = 1 Then
                Dim Host As Net.IPHostEntry = Net.Dns.GetHostEntry(strcomputer)
                Dim firstaddress As Net.IPAddress = Host.AddressList(0)
                ip = firstaddress.ToString                
            End If
            flag1 = pc3
            flag2 = ip
            flag3 = rownum
            worker.ReportProgress(prog1)
        Next
     End Sub

Open in new window

0
 
jcampingAuthor Commented:
That works great! Thanks!
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Cloud Class® Course: Microsoft Windows 7 Basic

This introductory course to Windows 7 environment will teach you about working with the Windows operating system. You will learn about basic functions including start menu; the desktop; managing files, folders, and libraries.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now