timer停止后怎样再让他隔一段时间后在自动启动

xb12369 2012-05-30 11:29:22
页面上有一个label1,timer1,代码如下:

private void timer1_Tick_1(object sender, EventArgs e) //timer1的tick事件
{
if (i == 1)
{
timer1.Stop();
}
else
{
Thread t = new Thread(new ThreadStart(TimerStart)); //这里是线程
t.Start();
}
i++;
}

public void TimerStart()
{
label1.Text = "maopian jijiang kaishi " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
}

private void Form1_Load(object sender, EventArgs e) //加载事件
{
timer1.Start();
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;

}


PS:现在的条件是执行完一次后,timer1必须停住,那么我在通过什么方式可以在以后每隔10s后再次启动timer1呢???

想的头都大了,希望大神显灵!
...全文
1069 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
guanlianan 2012-12-06
  • 打赏
  • 举报
回复
引用 17 楼 xb12369 的回复:
感谢大家的热心回帖(一贯原则:参与就有分)! 最后的解决办法:在用个timer2来控制timer1,通过一个变量来控制,当timer1完成一次后,改变flog的值,timer2就是通过这个blog来控制timer1,这样就解决了,我一直卡在无法自动启 动timer1的tick,也许这个委托TimerCallback在作怪,不过解决才是王道! 如果须知详细……
兄弟,十分感谢您提供的思路,这个问题也困扰了我几个月,今天终于解决了。Timer_Tick事件里面的代码没有执行完,但是Interval用完的时候,Timer_Tick是会重新启动的,搞得我里面的代码总是运行两次或者多次。现在我用两个Timer来错开执行代码的时间,终于成功了!
xb12369 2012-05-31
  • 打赏
  • 举报
回复
感谢大家的热心回帖(一贯原则:参与就有分)!

最后的解决办法:在用个timer2来控制timer1,通过一个变量来控制,当timer1完成一次后,改变flog的值,timer2就是通过这个blog来控制timer1,这样就解决了,我一直卡在无法自动启

动timer1的tick,也许这个委托TimerCallback在作怪,不过解决才是王道!

如果须知详细,请给我留言!
__天涯寻梦 2012-05-30
  • 打赏
  • 举报
回复
计时器间隔设置 10s
timer1_Tick_1 方法里 if 判断去掉,i 这个变量也不要,第一行就是 timer1.Stop();
TimerStart 方法最后一行加上 timer1.Start();
这样就是计时器到点触发后就先关闭计时器,启动线程做你的工作,工作完成后开启计时器,等 10s 又再触发计时器方法,再关闭计时器,开始处理工作,循环这样,不知是不是你要的效果?
xb12369 2012-05-30
  • 打赏
  • 举报
回复
难道是我太纠结了,求帮助!
__天涯寻梦 2012-05-30
  • 打赏
  • 举报
回复
timer1_Tick_1 只是执行第一次时 stop ,之后再执行就不要 stop 了?
如果是这样,首先设置间隔 10s ,再在 i++ 之前加上
if (i == 1)
{
timer1.Start();
}

处理部分就加在上面的 if 语句之前。
wangsong145 2012-05-30
  • 打赏
  • 举报
回复
另外添加一个Timer,设置Interval,用来读取原来的timer是否已经停止,如果已经停止,则启动原来的timer
xb12369 2012-05-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

C# code

System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;


不建议使用这种方法,还有,为什么不把timer1的间隔设置成10s呢
[/Quote]

因为我后面用了线程了,所以必须的加上这个,否则会报错的!

timer1里面本身就在控制线程thread,真正的程序里必须停止掉timer,这里的只是我写的demo!

我的demo是希望能够在timer控制下的线程执行完某个操作停止后,通过什么方法再次启动!

PS:如果我在页面是丢个button,正常启动!
xb12369 2012-05-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

再添加一个timer来控制timer1
[/Quote]

再给点提示,谢谢!
xb12369 2012-05-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

这是什么命名空间下的 timer ,设置 timer 的间隔为 10s,没必要在执行的方法里 stop 它。
[/Quote]

就是在工具箱中拖出来的一个timer,应该是System.Form下的吧!

我已经用红色的标出了timer必须stop,这个是我写的测试代码,因为真正的程序里需要stop它!
火星大能猫 2012-05-30
  • 打赏
  • 举报
回复

System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;

不建议使用这种方法,还有,为什么不把timer1的间隔设置成10s呢
火星大能猫 2012-05-30
  • 打赏
  • 举报
回复
再添加一个timer来控制timer1
__天涯寻梦 2012-05-30
  • 打赏
  • 举报
回复
这是什么命名空间下的 timer ,设置 timer 的间隔为 10s,没必要在执行的方法里 stop 它。
__天涯寻梦 2012-05-30
  • 打赏
  • 举报
回复
private void timer1_Tick_1(object sender, EventArgs e)  //timer1的tick事件
{
timer1.Stop();

Thread t = new Thread(new ThreadStart(TimerStart)); //这里是线程
t.Start();
}

public void TimerStart()
{
label1.Text = "maopian jijiang kaishi " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");

// 做事

timer1.Start();
}

private void Form1_Load(object sender, EventArgs e) //加载事件
{
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
timer1.Interval = 10000;
timer1.Start();
}
xb12369 2012-05-30
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

计时器间隔设置 10s
timer1_Tick_1 方法里 if 判断去掉,i 这个变量也不要,第一行就是 timer1.Stop();
TimerStart 方法最后一行加上 timer1.Start();
这样就是计时器到点触发后就先关闭计时器,启动线程做你的工作,工作完成后开启计时器,等 10s 又再触发计时器方法,再关闭计时器,开始处理工作,循环这样,不知是不是你要的效果?
[/Quote]


嗯,继续!!!!
手抓宝 2012-05-30
  • 打赏
  • 举报
回复
可以在线程方法(例子中的TimerStart())执行完毕后重置timer控件,设置间隔为10S,然后启动timer控件。。

System.Windows.Forms.Timer控件在启动时是不执行Tick事件的,在Interval指定时间到时后才会执行Tick事件。。。

例如你上边的demo:
public void TimerStart()
{
label1.Text = "maopian jijiang kaishi " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
timer1.Start();
}

ps:label1.Text = "maopian jijiang kaishi "
字符串的中文翻译是不是:毛片即将开始。。。。。。
花痴 2012-05-30
  • 打赏
  • 举报
回复
就是说你在stop的时候不stop它,只是把方法return,不执行代码就OK啦
花痴 2012-05-30
  • 打赏
  • 举报
回复
改成这样就好了嘛:

private void timer1_Tick_1(object sender, EventArgs e) //timer1的tick事件
{
try
{
if (i == 1)
{
return;
//timer1.Stop();
}
else
{
Thread t = new Thread(new ThreadStart(TimerStart)); //这里是线程
t.Start();
}
}
finally
{
i++;
}
}

public void TimerStart()
{
this.BeginInvoke(
new Action(
() =>
{
label1.Text = "maopian jijiang kaishi " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
}));
//label1.Text = "maopian jijiang kaishi " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
}

private void Form1_Load(object sender, EventArgs e) //加载事件
{
timer1.Start();
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;

}

PS:这段代码

else
{
Thread t = new Thread(new ThreadStart(TimerStart)); //这里是线程
t.Start();
}

其实是没有必要的,直接这样

else
{
label1.Text = "maopian jijiang kaishi " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
//Thread t = new Thread(new ThreadStart(TimerStart)); //这里是线程
//t.Start();
}

应该就可以了嘛

111,094

社区成员

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

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

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