有關 timer 計時器問題

jasper1983 2010-05-02 02:07:00
我現有一個計時器要用來做已經過時間的顯示

我的做法是在開始計時的時候先用一個變數記住開始的時間
long timerStartTick = DateTime.Now.Ticks;

然後在計時間的 tick 事件再算出經過時間
long elapsedTicks = DateTime.Now.Ticks - this.timerStartTick;

這樣運作的很好沒錯,可是我想要能夠暫停計時器,
於是我會叫用 timer.stop() 這個方法,
但是我希望當恢復計時器計時的時候能夠從我上次暫停的時間繼續計時,
那麼這樣應該要怎麼寫呢? 有請大俠說明,感恩。

...全文
421 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
蜡笔小龙 2011-06-02
  • 打赏
  • 举报
回复
你要暂停·~拿个变量把你当前时间存起来~继续的时候把时间读出来~就好啦
jasper1983 2010-05-02
  • 打赏
  • 举报
回复
非常感謝各位大俠,終於弄好了,算一算我已經弄了6個小時了,天阿...好瞎
jinleisnake 2010-05-02
  • 打赏
  • 举报
回复

dateTime=dateTime.AddSeconds(second);
jinleisnake 2010-05-02
  • 打赏
  • 举报
回复

String.Format ("{0:d2}:{1:d2}:{2:d2}", dateTime.Hour, dateTime.Minute, dateTimen.Second);

都是没有s的...上面错了...
jasper1983 2010-05-02
  • 打赏
  • 举报
回复
謝謝各位大俠,我馬上來試試 (已經弄了好幾個小時..暈),等下回報結果,再次感謝..
jinleisnake 2010-05-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jasper1983 的回复:]

引用 5 楼 jinleisnake 的回复:
你不是就要stop的时候不计时吗?要恢复计时再点start就可以了,second会继续++的


可是我要的比較希望是像 2 樓大哥的那樣方法,因為我的經過時間不只是單純秒數而已,

我還要用 timespan 來格式化總經過時間,像下面這樣:

TimeSpan elapsedSpan = new TimeSpan (elapse……
[/Quote]

DateTime dateTime = new DateTime();
dateTime.AddSeconds(second);
elapsedTime = String.Format ("{0:d2}:{1:d2}:{2:d2}", dateTime.Hours, dateTime.Minutes, dateTimen.Seconds);

这样就可以格式化时间了
mngzilin 2010-05-02
  • 打赏
  • 举报
回复
添加Button TextBox Timer
==============================
public Form1()
{
InitializeComponent();
IsStart = false;
}
System.Timers.Timer timer;
private void button1_Click(object sender, EventArgs e)
{
if (timer1.Enabled)
{
pauseDt = DateTime.Now;
timer1.Enabled = false;
}
else
{
startDt = startDt.Add(DateTime.Now.Subtract(pauseDt));
timer1.Enabled = true;
if (!IsStart)
{
IsStart = true;
startDt = DateTime.Now;
}
}

}
bool IsStart;
DateTime startDt,pauseDt;
private void timer1_Tick(object sender, EventArgs e)
{
TimeSpan ts = DateTime.Now.Subtract(startDt);
textBox1.Text = ts.TotalSeconds.ToString();
}
jasper1983 2010-05-02
  • 打赏
  • 举报
回复
我的程式大概就是下面這樣,我應該要怎麼完成下面那段才對??

privaet bool isStop;
private long timerStartTicks;

private void Form1_Load(object sender, EventArgs e)
{
timer1.Interval = 1000;
}

private void timer1_Tick(object sender, EventArgs e)
{
long elapsedTicks = DateTime.Now.Ticks - this.timerStartTick;

if (this.isStop) {
this.isStop = false;
elapsedTicks = .......????? //這裡要怎麼寫才能讓 elapsedTicks變成是我上次暫停的時間????
}

TimeSpan elapsedSpan = new TimeSpan (elapsedTicks);
elapsedTime = String.Format ("{0:d2}:{1:d2}:{2:d2}", elapsedSpan.Hours, elapsedSpan.Minutes, elapsedSpan.Seconds);

//...........
//.......

}
private void button_Start_Click(object sender, EventArgs e)
{
timer1.Start();
this.timerStartTick = DateTime.Now.Ticks;
}
private void button_Stop_Click(object sender, EventArgs e)
{
timer1.Stop();
this.isStop = true;
}
jasper1983 2010-05-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jinleisnake 的回复:]
你不是就要stop的时候不计时吗?要恢复计时再点start就可以了,second会继续++的
[/Quote]

可是我要的比較希望是像 2 樓大哥的那樣方法,因為我的經過時間不只是單純秒數而已,

我還要用 timespan 來格式化總經過時間,像下面這樣:

TimeSpan elapsedSpan = new TimeSpan (elapsedTicks);
elapsedTime = String.Format ("{0:d2}:{1:d2}:{2:d2}", elapsedSpan.Hours, elapsedSpan.Minutes, elapsedSpan.Seconds);

//........這裡是我要做的其他事
//.................
jasper1983 2010-05-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 mngzilin 的回复:]

暂停时候timer.stop()
继续的时候需要调整开始时间:

long elapsedTicks = DateTime.Now.Ticks - this.timerStartTick;
这里在暂停时已经获取到Ticks……
[/Quote]

好像不太對耶,我照您的方法這樣試

long elapsedTicks = DateTime.Now.Ticks - this.timerStartTick;

if (isStop)
this.timerStartTick = DateTime.Now.AddTicks (-elapsedTicks).Ticks;//取负值

結果還是不行,是不是我做錯了?
jinleisnake 2010-05-02
  • 打赏
  • 举报
回复
你不是就要stop的时候不计时吗?要恢复计时再点start就可以了,second会继续++的
jasper1983 2010-05-02
  • 打赏
  • 举报
回复
請問我已經暫停了 timer 所以應該不會再觸發 tick 事件了,那麼您的 seconds++ 要怎麼執行到呢? 如果是說不要用 stop() 暫停的話,用 flag 方式來通知 timer 暫停,那麼您的方法當我把 bStop = flash 時要如何可以從我暫停的時間繼續? 可以再請說明一下嗎?
jinleisnake 2010-05-02
  • 打赏
  • 举报
回复

private int second;
private void Form1_Load(object sender, EventArgs e)
{
timer1.Interval = 1000;
second = 0;
}
private void timer1_Tick(object sender, EventArgs e)
{
second++;
label1.Text = second.ToString();
}
private void button_Start_Click(object sender, EventArgs e)
{
timer1.Start();
}
private void button_Stop_Click(object sender, EventArgs e)
{
timer1.Stop();
}
mngzilin 2010-05-02
  • 打赏
  • 举报
回复
[Quote=引用楼主 jasper1983 的回复:]
但是我希望當恢復計時器計時的時候能夠從我上次暫停的時間繼續計時,
那麼這樣應該要怎麼寫呢? 有請大俠說明,感恩。
[/Quote]

暂停时候timer.stop()
继续的时候需要调整开始时间:

long elapsedTicks = DateTime.Now.Ticks - this.timerStartTick;
这里在暂停时已经获取到Ticks
在继续时候:
this.timerStartTick=DateTime.Now.AddTicks(-elapsedTicks);//取负值
threenewbee 2010-05-02
  • 打赏
  • 举报
回复
定义两个变量:

private bool bStop = false;
private int Seconds = 0;

定义一个timer,设置间隔为1s,在tick里面写:
if (!bStop) Seconds++;
if (Seconds == 120) // 2 minutes
{
//做你的事情。。。
Seconds = 0;
}

停止里面写:
bStop = true;

111,125

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧