Click here to Skip to main content
15,889,659 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
Hi, im currently learning C# at school. Were supposed to create a working traffic light system. You can already zap through the phases but I want to add another button, which runs the whole thing with a delay between actions. My question now is: How do I setup such a timer?

My code until now:
void Button1Click(object sender, EventArgs e)
		{
			if (panel3.BackColor == Color.Green) 
			{
				panel2.BackColor = Color.Yellow;
				panel3.BackColor = Color.Black;
				panel5.BackColor = Color.Yellow;
			}
			
			else if (panel2.BackColor == Color.Yellow && panel1.BackColor == Color.Black) 
			{
				panel1.BackColor = Color.Red;
				panel2.BackColor = Color.Black;
				panel4.BackColor = Color.Black;
				panel5.BackColor = Color.Black;
				panel6.BackColor = Color.Green;
			}
			
			else if (panel1.BackColor == Color.Red && panel2.BackColor == Color.Black) 
			{
				panel2.BackColor = Color.Yellow;
				panel5.BackColor = Color.Yellow;
				panel6.BackColor = Color.Black;
			}
			
			else if (panel1.BackColor == Color.Red && panel2.BackColor == Color.Yellow) 
			{
				panel1.BackColor = Color.Black;
				panel2.BackColor = Color.Black;
				panel3.BackColor = Color.Green;
				panel5.BackColor = Color.Black;
				panel4.BackColor = Color.Red;

What I have tried:

I already googled of course but I couldn't seem to find somebody that explains it for SharpDevelop. I saw many people using VisualStudio, but I want to do it in SharpDevelop.
Posted
Updated 26-Nov-22 7:47am

The simplest way would be to use the Thread.Sleep Method (System.Threading) | Microsoft Learn[^]
 
Share this answer
 
Comments
crizzli 26-Nov-22 11:03am    
I added Thread.Sleep(2000) in between lines. However when I press the button, the programm freezes for a few seconds but nothing changed.

void Button2Click(object sender, EventArgs e)
{
if (panel3.BackColor == Color.Green)
{
panel2.BackColor = Color.Yellow;
panel3.BackColor = Color.Black;
panel5.BackColor = Color.Yellow;
}

Thread.Sleep(1000);

if (panel2.BackColor == Color.Yellow && panel1.BackColor == Color.Black)
{
panel1.BackColor = Color.Red;
panel2.BackColor = Color.Black;
panel4.BackColor = Color.Black;
panel5.BackColor = Color.Black;
panel6.BackColor = Color.Green;
}

Thread.Sleep(1000);

if (panel1.BackColor == Color.Red && panel2.BackColor == Color.Black)
{
panel2.BackColor = Color.Yellow;
panel5.BackColor = Color.Yellow;
panel6.BackColor = Color.Black;
}

Thread.Sleep(1000);

if (panel1.BackColor == Color.Red && panel2.BackColor == Color.Yellow)
{
panel1.BackColor = Color.Black;
panel2.BackColor = Color.Black;
panel3.BackColor = Color.Green;
panel5.BackColor = Color.Black;
panel4.BackColor = Color.Red;
}
Richard MacCutchan 26-Nov-22 11:34am    
Yes, that is a problem with sleep, it stops the screen from being updated. The way round this is to use timers and delegates or background workers. But those are somewhat advanced subjects.
A possible solution is to use async-await (in .NET Framework above 4.5).
I created this quick example in .NET Framework 4.6.1
In this case, the winform does not freeze when waiting for "Say Hello" after button click, and you can move the GUI freely when it waits. Perhaps this async-await pattern is suitable in your case. I suggest to try it,
BR

// .NET Framework 4.6.1
//-------------------------------
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }

    private async void button1_Click(object sender, EventArgs e)
    {
      await Task.Delay(15000);
      MessageBox.Show("Say Hello");
    }
  }
}
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900