C#中的交通信号灯问题,请帮忙具体解释下其中的部分程序,急求
发布网友
发布时间:2022-04-24 01:53
我来回答
共2个回答
热心网友
时间:2023-04-30 07:44
你好,
关于C#中timer类 在C#里关于定时器类就有3个 (winform3个,wpf1个我们这里不说)
1.定义在System.Windows.Forms里 工具拖放(不精确)
2.定义在System.Threading.Timer类里 计时精确
3.定义在System.Timers.Timer类里 计时精确(对前者封装,增加了一些特性)
你这个从代码上看应该是用的第1个控件, 该计时器使用消息循环机制来取代线程池产生消息的机制,意味着Tick事件总是在创建timer的那个线程上执行(一般就是你的主线程),同时也意味着如果上一个Tick消息还未被处理,即使时间超过了间隔时间,在消息循环中也只存在一个Tick消息,换句话说, 也意味着可能会无限期的把实际要用的5秒计时变为100秒 1000秒.
虽然计时不精确,但是是单线程,永远只执行一个,不会出现同一时间两次执行.(也就是说不会出现两个线程同时执行这段代码,所以是线性安全的!!!!!这个用在交通灯上面很好,但是,这个不应该是工业级的代码,这段代码不安全.因为如果系统突然出现问题,这个程序 会有时间差,如果是一个软件中的一个计时器控制一个十字路口的多个红绿灯就没有问题,但是如果这个软件有多个计时器,那么还是可能会在极端情况下,出现问题的,..老兄,你这代码不要真用于工作啊.罗嗦了,O(∩_∩)O)
你的系统每规定时间执行void timer1_Tick()这个方法
下面的文字乱糟糟的,你放在vs2012之类的编辑器中重新格式化一下
Graphics g =this.CreateGraphics();//创建图形
if (intTime!= 0) //这个变量是外部定义的
{
if(intTime < 10) //如果小于10 ,按照里面的代码说,是10 9 8 7 6 5这样减少,一直到0就停止,顺道再把 intTime 设置为5 ,搞不懂这样写代码的意义,可能代码外面还有其他作用吧
{
label1.Text = "0" + intTime.ToString();//将控件值弄为 09 06 04之类的值
label1.ForeColor = Color.Red;//并且label1的文字颜色变为红色 }
else
{
label1.Text = intTime.ToString();//否则就刷新0-9的值在label1空间商
label1.ForeColor = Color.Red;//颜色依然是红色
}
intTime--;//减去1,
intFalg= 1;//这是外部变量, 标志为1 (估计这个就是你说的交通灯切换信号,至于1是红色还是绿色,你调试程序的时候才知道啊)
getFillColor();//填充图形,这是外部方法
}
else //如果intTime ==0
{
label1.Text = "0" + intTime.ToString();//写成"00"
timer1.Enabled = false;//计时器停止工作/
intFalg= 0;//信号设置为0
intTime= 5;//同时将外部值intTime设置为5
timer1.Enabled = false;//当前计时器不可用 (也就是停止工作了)
timer3.Enabled = true;//另外一个计时器可用,是否立即执行,看这个的设置(timer3这个可以用了,但是是不是立即执行,是有一个设置的,在vs的编辑器里面,你找找属性,里面有一个规定,规定了timer是立即执行一次,然后循环,还是完全不执行等待系统调用,然后循环(这是两种工作模式))
}追问你太酷了,关键时刻你解救了我,真心感谢额,要是再有问题我还可以再询问你吗?再次感谢额
追答用百度发私信, 我会回答你问题的,只是我一两天甚至三四天才会登陆百度一次.(很多时候不在百度的登陆状态)
热心网友
时间:2023-04-30 07:44
大概是使用Timer计时,画出绿灯的时候,绿灯的Timer开始,在Tick事件里将计数器自减,当计数器为0 就停止绿灯的Timer开启红灯的Timer,做同样的计数器自减,实现红灯,绿灯交替闪烁。
原理大概是这样,希望有帮到你