问题描述
小弟初学C#,在做一个Winform程序,现在问题出在根据设置的坐标画折线图,我是使用1ms定时器来实现折线轨迹的绘制,下面我说下目前的情况,我先用1个定时器画一条线做实验,折线图可以按照规定的速度顺利画出,但用2个定时器同时画两条线,按照设定折线图应该是第一条画完才画第二条,但两条同时画出且速度很快,下面是相关代码,求解答。。privatevoidbutton31_Click(objectsender,EventArgse){timer1.Enabled=true;timer2.Enabled=true;}//设定定时器privatevoidtimer1_Tick(objectsender,EventArgse){Graphicsg=this.pictureBox1.CreateGraphics();if(a==1&&d==1){switch(BZW){case0:g.DrawLine(Pens.Red,30,250,30+z/5,250);z++;if(z>(hourA12*125+minA12*2)){BZW=1;z=0;}break;case1:g.DrawLine(Pens.Red,30+hourA12*25,250,30+hourA12*25+z/5,250-z*3/((hourA21-hourA12)*5));z++;if(z>((hourA21-hourA12)*125+(minA21-minA12)*2)){BZW=2;z=0;}break;case2:g.DrawLine(Pens.Red,30+hourA21*25,175,30+hourA21*25+z/5,175);z++;if(z>((hourA22-hourA21)*125+(minA22-minA21)*2)){BZW=3;z=0;}break;case3:g.DrawLine(Pens.Red,30+hourA22*25,175,30+hourA22*25+z/5,175-z*3/((hourA31-hourA22)*5));z++;if(z>((hourA31-hourA22)*125+(minA31-minA22)*2)){BZW=4;z=0;}break;case4:g.DrawLine(Pens.Red,30+hourA31*25,100,30+hourA31*25+z/5,100);z++;if(z>((hourA32-hourA31)*125+(minA32-minA31)*2)){BZW=5;z=0;}break;case5:g.DrawLine(Pens.Red,30+hourA32*25,100,30+hourA32*25+z/5,100-z*3/((hourA41-hourA32)*5));z++;if(z>((hourA41-hourA32)*125+(minA41-minA32)*2)){BZW=6;z=0;}break;case6:g.DrawLine(Pens.Red,30+hourA41*25,25,30+hourA41*25+z*3/((hourA42-hourA41)*5),25);z++;if(z>((hourA42-hourA41)*125+(minA42-minA41)*2)){BZW=7;z=0;timer1.Enabled=false;}break;}}}privatevoidtimer2_Tick(objectsender,EventArgse){Graphicsg=this.pictureBox1.CreateGraphics();if(f==1&&i==1){switch(BZW){case0:g.DrawLine(Pens.Blue,30,250,30+z/5,250);z++;if(z>(hourB12*125+minB12*2)){BZW=1;z=0;}break;case1:g.DrawLine(Pens.Blue,30+hourB12*25,250,30+hourB12*25+z/5,250-z*3/((hourB21-hourB12)*5));z++;if(z>((hourB21-hourB12)*125+(minB21-minB12)*2)){BZW=2;z=0;}break;case2:g.DrawLine(Pens.Blue,30+hourB21*25,175,30+hourB21*25+z/5,175);z++;if(z>((hourB22-hourB21)*125+(minB22-minB21)*2)){BZW=3;z=0;}break;case3:g.DrawLine(Pens.Blue,30+hourB22*25,175,30+hourB22*25+z/5,175-z*3/((hourB31-hourB22)*5));z++;if(z>((hourB31-hourB22)*125+(minB31-minB22)*2)){BZW=4;z=0;}break;case4:g.DrawLine(Pens.Blue,30+hourB31*25,100,30+hourB31*25+z/5,100);z++;if(z>((hourB32-hourB31)*125+(minB32-minB31)*2)){BZW=5;z=0;}break;case5:g.DrawLine(Pens.Blue,30+hourB32*25,100,30+hourB32*25+z/5,100-z*3/((hourB41-hourB32)*5));z++;if(z>((hourB41-hourB32)*125+(minB41-minB32)*2)){BZW=6;z=0;}break;case6:g.DrawLine(Pens.Blue,30+hourB41*25,25,30+hourB41*25+z*3/((hourB42-hourB41)*5),25);z++;if(z>((hourB42-hourB41)*125+(minB42-minB41)*2)){BZW=7;z=0;timer1.Enabled=false;}break;}}}
下面是实验1和实验2的结果hourA11为列车A进站1时间,hourA12为列车A出站1时间,以此类推
解决方案
解决方案二:
1ms定时器,假设能实现的话,意味着每秒刷新1000次。你的LCD显示器每秒才刷新60次,你刷1000次作什么用?
解决方案三:
定时器触发的次序是随机的。所谓1ms是不可能达到的,至少来说,这个1ms能有10ms的误差也是正常的。不要假设“按顺序交替触发”,你就能发现你的代码中为什么会有的变量值混乱了。任何性能问题,一开始都是小孩子玩1个东西以为没事(因为CPU全部资源都给她了),然后等规模上到3、4个就卡得不行不行的了,规模上到10几个就死掉了。
解决方案四:
如果用你的两个定时器的逻辑,那么当定时器1打开时,定时器2应该关闭;当定时器2打开时,定时器1应该关闭;同时每一个定时器在触发事件时,都要首先关闭自己,然后才去画图。这样才能保证时序。定时器的Interval到底应该设置多少,以及是否应该使用傻傻地定时器,以及画图的逻辑,以及使用的底层结构,都要不断改进。将来有一天,如果你在一个产品团队,你看到有人这样设计软件时你就像踢他一脚,那时候你就可能是合格的程序设计师了。
解决方案五:
引用3楼sp1234的回复:
如果用你的两个定时器的逻辑,那么当定时器1打开时,定时器2应该关闭;当定时器2打开时,定时器1应该关闭;同时每一个定时器在触发事件时,都要首先关闭自己,然后才去画图。这样才能保证时序。定时器的Interval到底应该设置多少,以及是否应该使用傻傻地定时器,以及画图的逻辑,以及使用的底层结构,都要不断改进。将来有一天,如果你在一个产品团队,你看到有人这样设计软件时你就像踢他一脚,那时候你就可能是合格的程序设计师了。
我先消化一下先TT
解决方案六:
引用1楼Forty2的回复:
1ms定时器,假设能实现的话,意味着每秒刷新1000次。你的LCD显示器每秒才刷新60次,你刷1000次作什么用?
我要实现的功能是绘制轨迹,模拟的列车在各车站的运行的,比如A车最初就在左下角一个点,随着运行,图上轨迹也逐渐显示出折线
解决方案七:
你需要模拟的应该是数据源(图示的串口),每次为各列车的位置程序根据得到的列车位置,换算成图标上的坐标并保存到序列中,每个列车一个序列然后用g.DrawLines逐个画出你现在的流程,与实际情况不符。若要让你的程序实用化(没有了定时器),则整个都得推倒重来