| | |
Timers don't work right
Please support our VB.NET advertiser: Intel Parallel Studio Home
Thread Solved |
•
•
Join Date: Sep 2006
Posts: 181
Reputation:
Solved Threads: 6
So I have a question about timers and need some help...
I'm still learning VB.NET programming, so I'm a beginner here...but so far, with timers and all, I've been able to do them well. My last assignment dealing with timers went very smooth...one of the things was to create timers to change the background color of the form and loop through several colors every 5 seconds, than have a button to change the timer intervals to 2 seconds. I did everything, and it worked.
Than came the next assignment. Traffic Lights. I have to have 3 timers, one for the red light, one for yellow, and one for green. I used pictures are my traffic lights. Here is how the timers have to go, how the lights should come on, and for how long.
Red light has to stay on for 20 seconds.
Than green light comes next, for 16 seconds.
Than yellow light comes after that, for 4 seconds.
Than the entire thing has to loop again, starting from red until the user clicks STOP.
With my earlier timer assignment, and this one, they seem to be closely related and takes about the same thing and looks to be done the same way. But, I was wrong in thinking that OR I'm doing something wrong with the timers.
When I click the start button, the red timer is enabled. Here is the timer settings. I specified these settings in the design view under the timer settings. So I didn't write it in the code area.
TM = Timer
R=Red
G=Green
Y=Yellow
TMR=TimerRed
TMG=TimerGreen
TMY=TimerYellow
I also have 4 images on the form. And here are their names.
TL=Traffic Light
TLR = Traffic Light Red
TLG = Traffic Light Green
TLY = Traffic Light Yellow
TL is on top, and everything is blank, than TLR is the same TL image, except with a red circle for the red light, and so on.
So TMR HAS to display TLR for 20 seconds, than go on to TMG and display TLG for 16 seconds, than go on to TMY and display TLY for 4 seconds, than start again at TMR and display TLR for 20 seconds, etc.....
But it's not working like that. I coded my start button to display TLR AND start the TMR timer, which again, is set to display TLR again. The reason I told my button to display TLR is because when I start the TMR timer, it waits 16-20 seconds before it starts displaying TLR...but I wanted TLR to be displayed once the button was clicked, so it doesn't throw the user off thinking it doesn't work.
So, here is what the program is actually doing. When I click start, TMR starts, BUT, TLR is displayed for 16 seconds, TMG is displayed for 4 seconds, and TLY is displayed for 20 seconds. The timer interval from Red went to yellow, from yellow it went to green, and from green it went to red. So basically, the timer intervals went one up. I can't figure out why it did that.
I than tried using a label and colors and doing the same thing, instead of using images. And yet again, same problem. BUT, in my earlier program, everything worked fine, the color changed in the right order.
So here is my source code for the program.
So far, I've been doing great in programming, in my class, I'm the fastest programmer and easily solve other people's problems, but this problem has really cut me back So can anyone help me? If you need me to clarify my problem more, or provide the images to the application, or anything else. Let me know and I'll be happy to provide anything
Thanks for reading and helping
-PcPro12
I'm still learning VB.NET programming, so I'm a beginner here...but so far, with timers and all, I've been able to do them well. My last assignment dealing with timers went very smooth...one of the things was to create timers to change the background color of the form and loop through several colors every 5 seconds, than have a button to change the timer intervals to 2 seconds. I did everything, and it worked.
Than came the next assignment. Traffic Lights. I have to have 3 timers, one for the red light, one for yellow, and one for green. I used pictures are my traffic lights. Here is how the timers have to go, how the lights should come on, and for how long.
Red light has to stay on for 20 seconds.
Than green light comes next, for 16 seconds.
Than yellow light comes after that, for 4 seconds.
Than the entire thing has to loop again, starting from red until the user clicks STOP.
With my earlier timer assignment, and this one, they seem to be closely related and takes about the same thing and looks to be done the same way. But, I was wrong in thinking that OR I'm doing something wrong with the timers.
When I click the start button, the red timer is enabled. Here is the timer settings. I specified these settings in the design view under the timer settings. So I didn't write it in the code area.
TM = Timer
R=Red
G=Green
Y=Yellow
TMR=TimerRed
TMG=TimerGreen
TMY=TimerYellow
vb.net Syntax (Toggle Plain Text)
TMR.Interval = 20000 '(20 seconds) TMG.Interval = 16000 '(16 seconds) TMY.Interval = 4000 '(4 seconds)
TL=Traffic Light
TLR = Traffic Light Red
TLG = Traffic Light Green
TLY = Traffic Light Yellow
TL is on top, and everything is blank, than TLR is the same TL image, except with a red circle for the red light, and so on.
So TMR HAS to display TLR for 20 seconds, than go on to TMG and display TLG for 16 seconds, than go on to TMY and display TLY for 4 seconds, than start again at TMR and display TLR for 20 seconds, etc.....
But it's not working like that. I coded my start button to display TLR AND start the TMR timer, which again, is set to display TLR again. The reason I told my button to display TLR is because when I start the TMR timer, it waits 16-20 seconds before it starts displaying TLR...but I wanted TLR to be displayed once the button was clicked, so it doesn't throw the user off thinking it doesn't work.
So, here is what the program is actually doing. When I click start, TMR starts, BUT, TLR is displayed for 16 seconds, TMG is displayed for 4 seconds, and TLY is displayed for 20 seconds. The timer interval from Red went to yellow, from yellow it went to green, and from green it went to red. So basically, the timer intervals went one up. I can't figure out why it did that.
I than tried using a label and colors and doing the same thing, instead of using images. And yet again, same problem. BUT, in my earlier program, everything worked fine, the color changed in the right order.
So here is my source code for the program.
vb.net Syntax (Toggle Plain Text)
Public Class Form1 Inherits System.Windows.Forms.Form #Region " Windows Form Designer generated code " Public Sub New() MyBase.New() 'This call is required by the Windows Form Designer. InitializeComponent() 'Add any initialization after the InitializeComponent() call End Sub 'Form overrides dispose to clean up the component list. Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean) If disposing Then If Not (components Is Nothing) Then components.Dispose() End If End If MyBase.Dispose(disposing) End Sub 'Required by the Windows Form Designer Private components As System.ComponentModel.IContainer 'NOTE: The following procedure is required by the Windows Form Designer 'It can be modified using the Windows Form Designer. 'Do not modify it using the code editor. Friend WithEvents TLR As System.Windows.Forms.PictureBox Friend WithEvents TLY As System.Windows.Forms.PictureBox Friend WithEvents TLG As System.Windows.Forms.PictureBox Friend WithEvents TL As System.Windows.Forms.PictureBox Friend WithEvents btnStart As System.Windows.Forms.Button Friend WithEvents MainMenu1 As System.Windows.Forms.MainMenu Friend WithEvents mnuFile As System.Windows.Forms.MenuItem Friend WithEvents mnuExit As System.Windows.Forms.MenuItem Friend WithEvents tmr As System.Windows.Forms.Timer Friend WithEvents tmg As System.Windows.Forms.Timer Friend WithEvents tmy As System.Windows.Forms.Timer Friend WithEvents Button1 As System.Windows.Forms.Button Friend WithEvents Timer1 As System.Windows.Forms.Timer Friend WithEvents Timer2 As System.Windows.Forms.Timer <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent() Me.components = New System.ComponentModel.Container Dim resources As System.Resources.ResourceManager = New System.Resources.ResourceManager(GetType(Form1)) Me.TLR = New System.Windows.Forms.PictureBox Me.TLY = New System.Windows.Forms.PictureBox Me.TLG = New System.Windows.Forms.PictureBox Me.TL = New System.Windows.Forms.PictureBox Me.btnStart = New System.Windows.Forms.Button Me.MainMenu1 = New System.Windows.Forms.MainMenu Me.mnuFile = New System.Windows.Forms.MenuItem Me.mnuExit = New System.Windows.Forms.MenuItem Me.tmr = New System.Windows.Forms.Timer(Me.components) Me.tmg = New System.Windows.Forms.Timer(Me.components) Me.tmy = New System.Windows.Forms.Timer(Me.components) Me.Button1 = New System.Windows.Forms.Button Me.Timer1 = New System.Windows.Forms.Timer(Me.components) Me.Timer2 = New System.Windows.Forms.Timer(Me.components) Me.SuspendLayout() ' 'TLR ' Me.TLR.BackgroundImage = CType(resources.GetObject("TLR.BackgroundImage"), System.Drawing.Image) Me.TLR.Location = New System.Drawing.Point(48, 16) Me.TLR.Name = "TLR" Me.TLR.Size = New System.Drawing.Size(72, 160) Me.TLR.TabIndex = 0 Me.TLR.TabStop = False ' 'TLY ' Me.TLY.BackgroundImage = CType(resources.GetObject("TLY.BackgroundImage"), System.Drawing.Image) Me.TLY.Location = New System.Drawing.Point(48, 16) Me.TLY.Name = "TLY" Me.TLY.Size = New System.Drawing.Size(72, 160) Me.TLY.TabIndex = 1 Me.TLY.TabStop = False ' 'TLG ' Me.TLG.BackgroundImage = CType(resources.GetObject("TLG.BackgroundImage"), System.Drawing.Image) Me.TLG.Location = New System.Drawing.Point(48, 16) Me.TLG.Name = "TLG" Me.TLG.Size = New System.Drawing.Size(72, 160) Me.TLG.TabIndex = 2 Me.TLG.TabStop = False ' 'TL ' Me.TL.BackgroundImage = CType(resources.GetObject("TL.BackgroundImage"), System.Drawing.Image) Me.TL.Location = New System.Drawing.Point(48, 16) Me.TL.Name = "TL" Me.TL.Size = New System.Drawing.Size(72, 160) Me.TL.TabIndex = 3 Me.TL.TabStop = False ' 'btnStart ' Me.btnStart.Location = New System.Drawing.Point(464, 40) Me.btnStart.Name = "btnStart" Me.btnStart.TabIndex = 4 Me.btnStart.Text = "Start" ' 'MainMenu1 ' Me.MainMenu1.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {Me.mnuFile}) ' 'mnuFile ' Me.mnuFile.Index = 0 Me.mnuFile.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {Me.mnuExit}) Me.mnuFile.Text = "File" ' 'mnuExit ' Me.mnuExit.Index = 0 Me.mnuExit.Text = "Exit" ' 'tmr ' Me.tmr.Interval = 20000 ' 'tmg ' Me.tmg.Interval = 16000 ' 'tmy ' Me.tmy.Interval = 4000 ' 'Button1 ' Me.Button1.Location = New System.Drawing.Point(512, 136) Me.Button1.Name = "Button1" Me.Button1.TabIndex = 5 Me.Button1.Text = "Button1" ' 'Timer1 ' Me.Timer1.Interval = 2000 ' 'Timer2 ' Me.Timer2.Interval = 2000 ' 'Form1 ' Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13) Me.BackColor = System.Drawing.Color.White Me.ClientSize = New System.Drawing.Size(632, 278) Me.Controls.Add(Me.Button1) Me.Controls.Add(Me.btnStart) Me.Controls.Add(Me.TL) Me.Controls.Add(Me.TLG) Me.Controls.Add(Me.TLY) Me.Controls.Add(Me.TLR) Me.Menu = Me.MainMenu1 Me.Name = "Form1" Me.Text = "Traffic Light" Me.ResumeLayout(False) End Sub #End Region Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click 'hides TL and displayed TR TL.Visible = False TLR.Visible = True 'starts the TMG timer tmg.Enabled = True End Sub Private Sub mnuExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuExit.Click 'closes the program Dim splash As New splash Me.Close() splash.Close() End Sub Private Sub tmr_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmr.Tick 'displays TLR and hides everything else TLY.Visible = False TLG.Visible = False TLR.Visible = True 'disables this timer and starts TMG tmr.Enabled = False tmg.Enabled = True End Sub Private Sub tmg_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmg.Tick 'displays TLG and hides everything else TLY.Visible = False TLR.Visible = False TLG.Visible = True 'disables this timer and starts TMY tmg.Enabled = False tmy.Enabled = True End Sub Private Sub tmy_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmy.Tick 'displays TLY and hides everything else TLR.Visible = False TLG.Visible = False TLY.Visible = True 'disables this timer and starts TMR tmy.Enabled = False tmr.Enabled = True End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'when the form loads, all images except TL are hidden TLR.Visible = False TLG.Visible = False TLY.Visible = False End Sub End Class
Thanks for reading and helping
-PcPro12
•
•
Join Date: Sep 2009
Posts: 301
Reputation:
Solved Threads: 43
0
#2 Oct 20th, 2009
I think your confusing yourself with so many different timers. I would suggest only using one timer (interval to one second) and through coding keep track of the elapsed time and which light should be displayed. Also take a look at "StopWatch" in the help file it shows how to get, format & display elapsed time.
•
•
Join Date: Sep 2009
Posts: 301
Reputation:
Solved Threads: 43
1
#3 Oct 20th, 2009
VB.NET Syntax (Toggle Plain Text)
Private Sub btnStart_Click(...) Handles btnStart.Click If btnStart.Text = "Start" Then btnStart.Text = "Stop" lblTrafficLight.Text = "Red" timRed.Enabled = True Else btnStart.Text = "Start" Select Case True Case timRed.Enabled timRed.Enabled = False Case timGreen.Enabled timGreen.Enabled = False Case timYellow.Enabled timYellow.Enabled = False End Select End If End Sub Private Sub timRed_Tick(...) Handles timRed.Tick lblTrafficLight.Text = "Green" timGreen.Enabled = True timRed.Enabled = False End Sub Private Sub timGreen_Tick(...) Handles timGreen.Tick lblTrafficLight.Text = "Yellow" timYellow.Enabled = True timGreen.Enabled = False End Sub Private Sub timYellow_Tick(...) Handles timYellow.Tick lblTrafficLight.Text = "Red" timRed.Enabled = True timYellow.Enabled = False End Sub
•
•
Join Date: Oct 2009
Posts: 1
Reputation:
Solved Threads: 1
0
#4 Oct 20th, 2009
Please dont confuse yourself with different timers as Tom says....keep it simple things wil go right.
•
•
Join Date: Sep 2006
Posts: 181
Reputation:
Solved Threads: 6
0
#6 Oct 20th, 2009
ohh...sorry...I'm still a beginner...and my previous assignment, I spent like 2 days to find out how to use one timer to loop 6 colors in the form background, and failed, thinking it wasn't possible..so I used 6 timers 
but I'm glad I can use one timer, and I would be glad to use just one. My assignment is just an explanation of what the program should do and look like. How I do it and what I use is up to me.
@girlwayne: I thought that WAS the simple way
I guess I was wrong...
Thanks for the code Tom, I'll try it, and it looks like I got WAY more to learn. I tend to write longer code for simple stuff. Even when simpler code exists.
Thanks Tom and girlwayne for the reply
but I'm glad I can use one timer, and I would be glad to use just one. My assignment is just an explanation of what the program should do and look like. How I do it and what I use is up to me.
@girlwayne: I thought that WAS the simple way
I guess I was wrong...Thanks for the code Tom, I'll try it, and it looks like I got WAY more to learn. I tend to write longer code for simple stuff. Even when simpler code exists.
Thanks Tom and girlwayne for the reply
•
•
Join Date: Sep 2006
Posts: 181
Reputation:
Solved Threads: 6
0
#7 Oct 20th, 2009
•
•
•
•
VB.NET Syntax (Toggle Plain Text)
Private Sub btnStart_Click(...) Handles btnStart.Click If btnStart.Text = "Start" Then btnStart.Text = "Stop" lblTrafficLight.Text = "Red" timRed.Enabled = True Else btnStart.Text = "Start" Select Case True Case timRed.Enabled timRed.Enabled = False Case timGreen.Enabled timGreen.Enabled = False Case timYellow.Enabled timYellow.Enabled = False End Select End If End Sub Private Sub timRed_Tick(...) Handles timRed.Tick lblTrafficLight.Text = "Green" timGreen.Enabled = True timRed.Enabled = False End Sub Private Sub timGreen_Tick(...) Handles timGreen.Tick lblTrafficLight.Text = "Yellow" timYellow.Enabled = True timGreen.Enabled = False End Sub Private Sub timYellow_Tick(...) Handles timYellow.Tick lblTrafficLight.Text = "Red" timRed.Enabled = True timYellow.Enabled = False End Sub

Thank you very much. You solved my problem completely. I just changed the label to my images and everything worked fine.
I noticed you set the GREEN color to the red timer, yellow color to the green timer, and red color to the yellow timer. I think that was where I was confused. The timer runs the time before executes its code, as I've noticed. So than what I did was display my code twice and put the colors in the wrong timers.
I also now understand and see why using too many timers is and would be very confusing and time consuming also.
I learned a lot from your replies and your code. Thanks again.
-PcPro12
Last edited by PcPro12; Oct 20th, 2009 at 5:02 pm.
•
•
Join Date: Sep 2009
Posts: 301
Reputation:
Solved Threads: 43
0
#8 Oct 20th, 2009
You sound like your trying to understand all that is going on with the code; so that is good. I didnt add comments to this to allow ya to think about it but if you need an explaination just ask.
Timer interval is set to 1,000
Personally I would do this with a loop, the StopWatch class and the TimeSpan object but I dont wanna get to far ahead of where your at in school.
Timer interval is set to 1,000
Personally I would do this with a loop, the StopWatch class and the TimeSpan object but I dont wanna get to far ahead of where your at in school.
VB.NET Syntax (Toggle Plain Text)
Public Class Form1 Dim m_intCounter As Integer = 0 Private Sub btnStart_Click(...) Handles btnStart.Click If btnStart.Text = "Start" Then btnStart.Text = "Stop" m_intCounter = 0 Timer1.Enabled = True Else btnStart.Text = "Start" lblTrafficLight.Text = "" lblTrafficLight.BackColor = Me.BackColor Timer1.Enabled = False End If End Sub Private Sub Timer1_Tick(...) Handles Timer1.Tick If m_intCounter >= 40 Then m_intCounter = 1 Else m_intCounter += 1 End If Select Case m_intCounter Case 1 To 20 lblTrafficLight.Text = "Red" lblTrafficLight.BackColor = Color.Red Case 21 To 36 lblTrafficLight.Text = "Green" lblTrafficLight.BackColor = Color.Green Case 37 To 40 lblTrafficLight.Text = "Yellow" lblTrafficLight.BackColor = Color.Yellow Case Else 'Do nothing End Select End Sub End Class
•
•
Join Date: Sep 2006
Posts: 181
Reputation:
Solved Threads: 6
0
#9 Oct 20th, 2009
ya, that's the first thing I do when I see a new piece of code. I read it and try to see what everything does. And so far, I understood all your code.
Ya, I wanted to do a loop too, but wasn't sure how to do it. I tried playing around with "DO WHILE LOOP", "IF ELSE", "SELECT CASE" statements. But I guess I was doing everything wrong. Cause nothing worked. By by looking at your code above, everything makes sense and I think it would just be easier to do the above instead of putting in 3 timers.
For my class, that would probably be too far. But not for me, I'm ahead of my class in programming and assignments. I learned very basic loop, case, if else statements. But they were basic only. Not much more advanced than that.
Once again, thanks for the help, I learned yet again some more new stuff from your code
-PcPro12
Ya, I wanted to do a loop too, but wasn't sure how to do it. I tried playing around with "DO WHILE LOOP", "IF ELSE", "SELECT CASE" statements. But I guess I was doing everything wrong. Cause nothing worked. By by looking at your code above, everything makes sense and I think it would just be easier to do the above instead of putting in 3 timers.
For my class, that would probably be too far. But not for me, I'm ahead of my class in programming and assignments. I learned very basic loop, case, if else statements. But they were basic only. Not much more advanced than that.
Once again, thanks for the help, I learned yet again some more new stuff from your code

-PcPro12
•
•
Join Date: Sep 2009
Posts: 301
Reputation:
Solved Threads: 43
0
#10 Oct 20th, 2009
Glad to help.
Well if you use a loop instead of a timer, you would have to keep track of the start time and with each itteration check the current time to see how much time has passed. The loop is easy, working with datetime functions and the timespan object get a bit more involved though.
If you type in "StopWatch" into the help file, it has a nice downloadable example of a stopwatch type of program. It shows how you can compare and format elapsed time for display.
Well if you use a loop instead of a timer, you would have to keep track of the start time and with each itteration check the current time to see how much time has passed. The loop is easy, working with datetime functions and the timespan object get a bit more involved though.
If you type in "StopWatch" into the help file, it has a nice downloadable example of a stopwatch type of program. It shows how you can compare and format elapsed time for display.
![]() |
Similar Threads
- Need 2 techies for tech-support, work from home (Tech / IT Consultant Job Offers)
- Requesting shadowing work at home job (Software Development Job Offers)
- Timer question: Scoreboard (VB.NET)
Other Threads in the VB.NET Forum
- Previous Thread: cmd.executenonquery not accepting nz function
- Next Thread: help me out to get rid of dis run-time error
| Thread Tools | Search this Thread |
.net .net2005 30minutes 2005 2008 access account arithmetic array basic binary bing button buttons center check code combobox component connectionstring crystalreport data database databasesearch datagrid datagridview design dissertation dissertations dissertationthesis dropdownlist excel file-dialog folder ftp generatetags google gridview hardcopy image images insert intel internet listview login mobile monitor ms net networking opacity output passingparameters peertopeervideostreaming picturebox picturebox1 plugin port print problem problemwithinstallation project reports" save savedialog searchbox searchvb.net select serial soap sql string table tcp text textbox timer toolbox trim update updown upload user usercontrol vb vb.net vb.netcode vb.netformclosing()eventpictureboxmessagebox vb.nettoolboxvisualbasic2008sidebar vb2008 vbnet view visual visualbasic visualbasic.net visualstudio visualstudio2008 web wpf





