How To Make a StopWatch With C# - c#

I just want to ask that if I can make a stopwatch with C# I tried:
private void button2_Click(object sender, EventArgs e)
{
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
int st = 00;
int m = 00;
string stime = "00:00";
if(st == 60)
{
m++;
st = 00;
}
else
{
st++;
}
if (m == 60)
{
m = 00;
}
if(st < 10)
{
st = 0 + st;
}
if(m < 10)
{
m = 0 + m;
}
stime = m.ToString() + ":" + st.ToString();
label3.Text = stime;
}
this but it didn't worked. My timer is setted up and the interval of the timer is 1000ms. Can someone help me?

It looks to me, that you are more likly to make a watch rather than a stopwatch?
If you're making a stopwatch, I think you need a field/property in your class that holds the starting time:
private DateTime _start;
private void button2_Click(object sender, EventArgs e)
{
_start = DateTime.Now;
timer1.Start();
}
and then in timer1_Tick you can do:
private void timer1_Tick(object sender, EventArgs e)
{
TimeSpan duration = DateTime.Now - _start;
label3.Text = duration.ToString(<some format string>);
}
It seems that your current code in timer1_Tick only has local variables and therefore always will produce the same time? :-)

Related

How to calculate time difference (subtract time) in C#?

I am creating program to measure vacuum value with Arduino and display it in the form that created with C#.
I want to store time as an constant. It is starting time of the program. I assigned it with "Connect" button. When I clicked, time value is storing.
Then I am using "timer tick" method to see measured values instantly. Also, DateTime.Now shows me instant system time. It is changing like a clock.
click here to see the picture
Here is the Connect button's code;
public void button1_Click(object sender, EventArgs e)
{
timer1.Enabled = true;
try
{
if (comboBox1.Text == "")
{
MessageBox.Show("Please select the port name!");
}
else
{
serialPort1.PortName = comboBox1.Text;
serialPort1.ReadBufferSize = 8;
serialPort1.Open();
timeval.Clear();
button1.Enabled = false;
button2.Enabled = true;
timer1.Start();
DateTime myDateTime = DateTime.Now; //It stores the instant time information when button is clicked.
label14.Text = myDateTime.ToString(); // shows in the label
//serialPort1.ReadTimeout = 300;
}
}
catch (UnauthorizedAccessException)
{
MessageBox.Show("Unauthorized Access!");
}
}
Here is the timer tick's code;
public void timer1_Tick(object sender, EventArgs e)
{
label12.Text = DateTime.Now.ToString();
//TimeSpan time_difference = DateTime.Now - myDateTime; // trying to calculate time difference.
//double saniye = time_difference.Seconds;
//double dakika = time_difference.Minutes;
//label10.Text = (Math.Round(saniye)).ToString();
//label16.Text = (Math.Round(dakika)).ToString();
new_data = 756 * (float.Parse(data) - 1023) / 1023;
sensorval.Add(Math.Round(new_data, 1));
all_data.Add(Math.Round(new_data, 1));
textBox1.Text = Convert.ToString(Math.Round(new_data, 2));
all_data.Sort();
var peak_vacuum = all_data[0];
textBox4.Text = peak_vacuum.ToString();
if (sensorval.Count % 100 == 0)
{
sensorval.Sort();
var find_max = sensorval[0];
var find_min = sensorval[sensorval.Count - 1];
textBox3.Text = find_min.ToString();
textBox2.Text = find_max.ToString();
sensorval.RemoveRange(0, 99);
}
}
I could not calculate time difference because myDateTime variable is calculating in button2 and defined in button2 method. But DateTime.Now is defined in timer tick method. So, I am getting an error that "The name 'myDateTime' does not exist in the current content." in the timer tick method.
By the way, I tried to use counter in the timer tick to see the seconds after program works. It was not so accurate. It was slower then the real time. So, I choose above method.
Thank you in advance.
I thinks its like what you want.
public partial class Form1 : Form
{
// accessable from all methods, events on Form1
private DateTime myDateTime;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
myDateTime = DateTime.Now;
// other codes
}
private void timer1_Tick(object sender, EventArgs e)
{
// other codes
}
private void button2_Click(object sender, EventArgs e)
{
// other codes
var diffrenceSpan = DateTime.Now - myDateTime;
var hours = diffrenceSpan.Hours;
var minutes = diffrenceSpan.Minutes;
var seconds = diffrenceSpan.Seconds;
}
}
gits project links

Countdown in C# by using loops

count-down isn't working ! can anyone tell me why ?
I want to create a countdown by using for-loop, not by using timer or other built-in methods...
int totaltime, time;
private void button1_Click(object sender, EventArgs e)
{
totaltime = int.Parse(label1.Text);
time = int.Parse(label1.Text);
for (int i = totaltime; i <= 0; i--)
{
--time;
label1.Text = time.ToString();
Task.Delay(1000);
}
to see code and application s.s click here !
Change your code to
int totaltime, time;
private async void button1_Click(object sender, EventArgs e)
{
totaltime = int.Parse(label1.Text);
time = int.Parse(label1.Text);
for (int i = totaltime; i >= 0; i--)
{
--time;
label1.Text = time.ToString();
await Task.Delay(1000);
}
}

How to display seconds using TimeSpan on Timer Tick Event

I am using below code to display time left in hh:mm:ss format for example if duration is 30min, it will show like this 00:30:00 and after 1 min it will show 00:29:00, how can i also display the remaining seconds and decrease them accordingly.,
Edit
I tried timer1.Interval = 1000; and
examTime = examTime.Subtract(TimeSpan.FromSeconds(1));
But its not showing me seconds reducing each second, How do i do it ?
public SubjectExamStart()
{
InitializeComponent();
examTime = TimeSpan.FromMinutes(double.Parse(conf[1]));
label1.Text = examTime.ToString();
timer1.Interval = 60 * 1000;
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
if (sender == timer1)
{
if (examTime.TotalMinutes > 0)
{
examTime = examTime.Subtract(TimeSpan.FromMinutes(1));
label1.Text = examTime.ToString();
}
else
{
timer1.Stop();
MessageBox.Show("Exam Time is Finished");
}
}
}
Instead of Subtracting TimeSpan.FromMinutes you need to subtract from TimeSpan.FromSeconds
public SubjectExamStart()
{
InitializeComponent();
examTime = TimeSpan.FromSeconds(double.Parse(conf[1]));
label1.Text = examTime.ToString();
timer1.Interval = 1000;
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
if (sender == timer1)
{
if (examTime.TotalMinutes > 0)
{
examTime = examTime.Subtract(TimeSpan.FromSeconds(1));
label1.Text = examTime.ToString();
}
else
{
timer1.Stop();
MessageBox.Show("Exam Time is Finished");
}
}
}
If you want to format the Time Span value while assigning to Label... You can use below..
label1.Text = examTime.ToString(#"dd\.hh\:mm\:ss");
To do this properly, you will need to keep a track of when the timer was started
DateTime examStartTime;
System.Windows.Forms.Timer runTimer;
TimeSpan totalExamTime = new TimeSpan(1, 30, 0); // Set exam time to 1 hour 30 minutes.
if (runTimer == null)
runTimer = new System.Windows.Forms.Timer();
runTimer.Interval = 200;
runTimer.Tick -= new EventHandler(runTimerTick);
runTimer.Tick += new EventHandler(runTimerTick);
examStartTime = DateTime.Now;
runTimer.Start();
Then in the event handler you can do:
public void runTimerTick(object sender, EventArgs e)
{
TimeSpan currentExamTime = DateTime.Now - examStartTime;
if (currentExamTime > totalExamTime)
{
MessageBox.Show("Exam Time is Finished");
runTimer.Stop();
runTimer.Tick -= new EventHandler(runTimerTick);
runTimer.Dispose();
}
}
I hope this helps.
try this hope this will work for u
set timer interval=1000
minremain=1200000; //Should be in milisecond
timerplurg.satrt();
private void timerplurg_Tick(object sender, EventArgs e)
{
minremain = minremain - 1000; //substring One second from total time
string Sec = string.Empty;
if (minremain <= 0)
{
lblpurgingTimer.Text = "";
timerplurg.Stop();
return;
}
else
{
var timeSpan = TimeSpan.FromMilliseconds(Convert.ToDouble(minremain));
var seconds = timeSpan.Seconds;
if (seconds.ToString().Length.Equals(1))
{
Sec = "0" + seconds.ToString();
}
else
{
Sec = seconds.ToString();
}
string Totaltime = "Remaing Second: " + Sec;
lblpurgingTimer.Text = Totaltime;
}

Adding sum to timer

I would like to know how to create a label that adds sum + 1 every 5 seconds? I've tried with an if loop but unfortunately it resets one second later.
Thank you in advantage for your attention
using System.Diagnostics;
// using system.diagnotics voor stopwatch
namespace WindowsFormsApplication7
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private Stopwatch sw = new Stopwatch();
private void button1_Click(object sender, EventArgs e)
{
timer1.Enabled = true;
sw.Start();
if (timer1.Enabled == true) { button1.Text = "stop"; }
else { button1.Text = "false"; sw.Stop(); }
}
private void timer1_Tick(object sender, EventArgs e)
{
int hours = sw.Elapsed.Hours;
int minutes = sw.Elapsed.Minutes;
int seconds = sw.Elapsed.Seconds;
int sum = 0;
label1.Text = hours + ":" ;
if (minutes < 10) { label1.Text += "0" + minutes + ":"; }
else { label1.Text += minutes + ":"; }
if (seconds < 10) { label1.Text += "0" + seconds ; }
else { label1.Text += seconds ; }
if (seconds ==5) { sum = sum +=1; }
label2.Text = Convert.ToString(sum);
}
}
}
sum should be a class field. Also you can use custom format string for elapsed TimeSpan.
int sum = 0;
private void timer1_Tick(object sender, EventArgs e)
{
// int sum = 0; local variable will be set to zero on each timer tick
label1.Text = sw.Elapsed.ToString(#"hh\:mm\:ss");
// btw this will not update sum each five seconds
if (sw.Elapsed.Seconds == 5)
sum++; // same as sum = sum +=1;
label2.Text = sum.ToString();
}
Your current implementation will increase sum only if current elapsed timeout's second value is five. Which could never happen (depending on your timer interval). If you have timer interval set to 1000 milliseconds, then you can increase sum on each tick, but set label2.Text = (sum % 5).ToString().
every time your stopwatch TICKS, sum is inside TICK and it will reset and start from
int sum=0;
so try to make sum variable GLOBAL outside timer1_Tick event and it will continue increasing.
You will have to move sum out of the timer callback as you are setting it to 0 each time the timer elapses
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private int sum = 0;
private DateTime lastUpdate;
private Stopwatch sw = new Stopwatch();
private void timer1_Tick(object sender, EventArgs e)
{
label1.Text = string.Format("{0:00}:{1:00}:{2:00}",
sw.Elapsed.Hours, sw.Elapsed.Minutes, sw.Elapsed.Seconds);
if (DateTime.Now >= lastUpdate.AddSeconds(5))
{
sum++;
lastUpdate = DateTime.Now;
label2.Text = sum.ToString();
}
}
private void button1_Click(object sender, EventArgs e)
{
if (timer1.Enabled == true)
{
sw.Stop();
button1.Text = "stop";
}
else
{
sum = 0;
lastUpdate = DateTime.Now;
timer1.Enabled = true;
sw.Start();
button1.Text = "Start";
}
}

c# counting clicks

I have a timer and in 30 minutes I want to count clicks and show it in a textbox. but how? here is timer code:
decimal sure = 10;
private void button1_Click(object sender, EventArgs e)
{
button1.Enabled = true;
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
sure--;
label3.Text = sure.ToString();
if (sure == 0)
{
timer1.Stop();
MessageBox.Show("Süre doldu");
}
}
Declare your clickCounter at global, and raise your counter++ in Mouse Click Event.
If you do it more specific, you can use Background Worker, to track time.
and use Application.DoEvents() to write remaining to to textBox
Put a button, 2 labels, and a timer. rename labels with lblClickCount and lblRemainingTime
private int clickCounter = 0;
private void button1_Click(object sender, EventArgs e)
{
clickCounter++;
lblClickCount.Text = clickCounter.ToString();
}
decimal sure = 10;
private void timer1_Tick(object sender, EventArgs e)
{
sure--;
lblRemainingTime.Text = sure.ToString();
Application.DoEvents();
if (sure == 0)
{
timer1.Stop();
MessageBox.Show("Süre doldu. Toplam tiklama sayisi:" + clickCounter.ToString());
}
}
If you wanted to reuse buttoN1 to count the clicks but not Start new timer you can add a if around the code you want to protect.
bool hasTimerStarted = false;
int numberOfClicks = 0;
private void button1_Click(object sender, EventArgs e)
{
if(!hasTimerStarted)
{
button1.Enabled = true;
timer1.Start();
hasTimerStarted = true;
}
++numberOfClicks;
}
When the timer expires you reset the count and if the timer has started.
private void timer1_Tick(object sender, EventArgs e)
{
TimeSpan ts = stopWatch.Elapsed;
// Format and display the TimeSpan value.
string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
ts.Hours, ts.Minutes, ts.Seconds,
ts.Milliseconds / 10);
label3.Text = elapsedTime;
labelClicks.Text = "User clicked " + clicksNo.toString() + "nt times..";
if (stopWatch.ElapsedMilliseconds >= this.minutes * 60 * 1000)
{
timer1.Stop();
MessageBox.Show("Time elapsed.");
hasTimerStarted = false;
numberOfClicks = 0;
}
}

Categories

Resources