关于Winform程序下多个定时器的问题

问题描述

小弟初学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逐个画出你现在的流程,与实际情况不符。若要让你的程序实用化(没有了定时器),则整个都得推倒重来

时间: 2025-01-31 06:08:50

关于Winform程序下多个定时器的问题的相关文章

使用devexpress开发的Winform程序,在联接互联网的状态下首次启动运行很快,如果未连接则启动至少要20秒,怎么回事?

问题描述 使用devexpress开发的Winform程序,发布后,在联接互联网的情况下首次启动运行很快,如果未连接互联网,则启动至少要20秒,怎么回事?不知道大家有没有遇到类似问题,如何解决,谢谢! 解决方案 解决方案二:有一次偶然在一个帖子上面看到,是说使用Devexpress控件的程序,第一次打开使用此控件的窗体时,需要联网认证,如果网络不通,需要重试三次,有方法破解,,但是现在找不到那个帖子了.如果有关注过此问题的大侠指点指点,谢谢解决方案三:所用的板本破解的不完整吧,到这里http:/

winform程序textbox滚动条保持在最下面 内容不闪烁

在开发winform程序时,会用到textbox控件来显示信息,当把textbox的Multiline属性改为Ture时(即多行显示状态),ScrollBars属性改为Vertical(内容过多时,显示竖状滚动条),显示内容过多时就会出现竖状滚动条. 默认情况下,当textbox内容改变时,winform会自动把textbox的滚动条定位到textbox的最上面.但这显然不是我们想要的结果,比如我们在开发一个聊天程序时,当发送了一条消息后,却还要把滚动条拖到最下面才能看到,这就让人火大了. 所以

利用WCF的Duplex服务向Winform程序推送消息

先看运行效果:在网页中发送消息[如图],利用WCF的Duplex服务向Winform 程序推送消息,Winform端接收到消息, 先建立两个项目,一个WebForm 项目和一个WinForm项目,并在项目下 建立好各自需要的文件 SendMessage.aspx 是发送消息的Web页面 ISendMessageService.cs 和 SendMessageService.svc用来实现WCF的 Duplex服务 GetMessageForm.cs 是接收消息的Winform窗口 当然, 还需要

使用Windows PowerShell创建WinForm程序

Windows PowerShell最突出之处便在于.NET类库的支持,很大的扩展了脚本的 能力.这使我们能直接在脚本中通过System.Windows.Forms程序集来创建窗口. 今天初次尝试了一下在PowerShell下创建WinForm程序,将完成的这个简单的 例子分享给大家. 如同在C#编写WinForm程序中一样,先创建一个Form类的实例,然后初始化: 添加流式布局面板,在面板上加了一个文本框和一个按钮,给控件添加必要的事 件处理.当然使用C#的时候通常是VS自动为我们生成一个窗体

C#发现之旅:C#开发Windows Service程序(下)

类似的对于"停止服务",其点击事件处理为 private void btnStopService_Click(object sender, EventArgs e) { if (bolServiceInstalled == false) return; using (System.ServiceProcess.ServiceController control = new System.ServiceProcess.ServiceController("MyFileSyste

C# WinForm程序与js交互的方法

在使用C#开发winform程序过程中,我们经常会碰到嵌入了一个WebBrowser的浏览器控件 .很多时候,我们需要在程序里控制网页的显示方式,或者调用网页当中的某个JS函数,反 过来,也有可能网页也需要调用程序当中的函数来实现某些功能.下面我给大家讲解下如何 互相进行交互. 程序调用JS脚本如下: JS脚本代码: <script language="javascript"> function ShopXG(infor) { alert('编程入门网 - www.bian

从WinForm程序中显示WPF Window出现“The URI prefix is not recognized”异

从WinForm程序中显示WPF Window出现"The URI prefix is not recognized"异常的解决方法 从WinForm App中显示WPF窗口的代码: MyWindow wpfWindow = new MyWindow(); WindowInteropHelper wih = new WindowInteropHelper(wpfWindow); wih.Owner = ownerHwnd; wpfWindow.ShowDialog(); 一般情况下,这

C# WinForm程序处理后台繁忙导致前台控件假死现象解决方法

  这篇文章主要介绍了C# WinForm程序处理后台繁忙导致前台控件假死现象解决方法,本文通过Application.DoEvents()解决这个问题,并讲解了Application.DoEvents()的作用,需要的朋友可以参考下 特别是针对循环或timer处理中需要在窗体控件显示数据时,因后台处理过度繁忙而出现没刷新或者假死现象时,可以使用 代码如下: Application.DoEvents(); Application.DoEvents()的作用 代码如下: private void

我在C#winform程序中药调用Excel接口,出现这个问题

问题描述 我在C#winform程序中药调用Excel接口,出现这个问题 Microsoft.Office.Interop.Excel.ApplicationClass"的 COM 对象强制转换为接口类型"Microsoft.Office.Interop.Excel._Application".此操作失败的原因是对 IID 为"{000208D5-0000-0000-C000-000000000046}"的接口的 COM 组件调用 QueryInterfa