Solved

Do Until with a timer issues...

Posted on 2008-09-30
2
179 Views
Last Modified: 2010-04-21
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
Comment
Question by:jcamping
2 Comments
 
LVL 85

Accepted Solution

by:
Mike Tomlinson earned 95 total points
Comment Utility
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
 

Author Closing Comment

by:jcamping
Comment Utility
That works great! Thanks!
0

Featured Post

Top 6 Sources for Identifying Threat Actor TTPs

Understanding your enemy is essential. These six sources will help you identify the most popular threat actor tactics, techniques, and procedures (TTPs).

Join & Write a Comment

Enums (shorthand for ‘enumerations’) are not often used by programmers but they can be quite valuable when they are.  What are they? An Enum is just a type of variable like a string or an Integer, but in this case one that you create that contains…
Since upgrading to Office 2013 or higher installing the Smart Indenter addin will fail. This article will explain how to install it so it will work regardless of the Office version installed.
As developers, we are not limited to the functions provided by the VBA language. In addition, we can call the functions that are part of the Windows operating system. These functions are part of the Windows API (Application Programming Interface). U…
Get people started with the process of using Access VBA to control Outlook using automation, Microsoft Access can control other applications. An example is the ability to programmatically talk to Microsoft Outlook. Using automation, an Access applic…

763 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

6 Experts available now in Live!

Get 1:1 Help Now