为什么Timer控件对全局变量不能精确控制运算?

zjnuan 2019-02-16 03:32:56
代码如下:
Timer1.interval=100;
int iiii = 6;
private void Timer1_Tick(System.Object sender, System.EventArgs e)
{
if (iiii > 0)
{
System.Diagnostics.Process.Start("https://www.baidu.com");//打开网址
iiii -= 1;
}
}


原意的效果是要:iiii减成0时不再减1,即最终结果iiii=0,即只运行6次Timer1事件(打开百度网址)就停止,但是实际运行结果是运行了二三十多次,而且是随机次数,iiii的值变成负二十几,好像是失控的样子。
但是删除 System.Diagnostics.Process.Start("https://www.baidu.com");这行代码,iiii的值减到0就会停止再减,感觉就是这行代码在作怪,为什么会有这种现象?
...全文
145 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjnuan 2019-02-16
  • 打赏
  • 举报
回复
引用 4 楼 胖叔叔写代码 的回复:
所以你的问题既不是全局变量的问题也不是timer的问题,是你自己把等待放在前面,这样你的全局变量就不会变化。
确实是这样。 还有就是原代码就算加上同步锁也是一样失控。 iiii -= 1;放在前面才能达到效果。
  • 打赏
  • 举报
回复
所以你的问题既不是全局变量的问题也不是timer的问题,是你自己把等待放在前面,这样你的全局变量就不会变化。
  • 打赏
  • 举报
回复
引用 楼主 zjnuan 的回复:
代码如下:
Timer1.interval=100;
int iiii = 6;
private void Timer1_Tick(System.Object sender, System.EventArgs e)
{
   if (iiii > 0)
  {
            System.Diagnostics.Process.Start("https://www.baidu.com");//打开网址
            iiii -= 1;
   }
}
原意的效果是要:iiii减成0时不再减1,即最终结果iiii=0,即只运行6次Timer1事件(打开百度网址)就停止,但是实际运行结果是运行了二三十多次,而且是随机次数,iiii的值变成负二十几,好像是失控的样子。 但是删除 System.Diagnostics.Process.Start("https://www.baidu.com");这行代码,iiii的值减到0就会停止再减,感觉就是这行代码在作怪,为什么会有这种现象?
切个片你就知道了,你这个是并行运行,并没有锁或者等待之前的事件完成的功能。 所以当iiii=6的时候进去后等待你的System.Diagnostics.Process.Start("https://www.baidu.com");完成,完成后iiii-1,这时候Timer1_Tick才不会再次执行,所以解决方法也很简单:

Timer1.interval=100;
int iiii = 6;
private void Timer1_Tick(System.Object sender, System.EventArgs e)
{
   if (iiii > 0)
  {
            iiii -= 1;
            System.Diagnostics.Process.Start("https://www.baidu.com");//打开网址
   }
}
你再看看会执行超过6次吗?
desperaso 2019-02-16
  • 打赏
  • 举报
回复
试一试这个,线程时间用,这里不知道行不
[DllImport("winmm.dll", EntryPoint = "timeBeginPeriod")]
public static extern uint _BeginPeriod(uint uMilliseconds);
[DllImport("winmm.dll", EntryPoint = "timeEndPeriod")]
public static extern uint _EndPeriod(uint uMilliseconds);


int _speed
_BeginPeriod((uint)_speed);
........................
........................
_EndPeriod((uint)_speed);

  • 打赏
  • 举报
回复
Process.Start 是阻塞的(卡死的),怎么可能保证几十毫秒就执行完毕?!

110,539

社区成员

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

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

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