C# GDI绘图使用Timer控件发生延迟 控件gdiTimer 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 this.Refresh(); 不是用这个是this.Invalidate();重绘控件 上面就是全部代码了?你这里else if (time % 20 == 0) { DateTime dt = DateTime.Now; now = dt; g.DrawString(dt.ToLongTimeString(), ft, blackBlush, 130, 154); time++; }time等于20次了,你应该将time等于0的吧,重新开始的 我改用了this.Invalidate();依旧有很大的延迟 继续加也没事啊只要能被20整除没看到你else的time++,如果你照ls的改了用this.Invalidate();调用OnPaint还延迟,我想可能是在执行重写的时候先执行基OnPaint方法,你断点看看是不是这样 private void timer1_Tick(object sender, EventArgs e) { Thread thr = new Thread(new ThreadStart(this.refresh)); thr.Start(); count++; }开了一个新线程之后运行了一会儿崩溃了是什么情况啊 这样当然崩溃。你会开启N个线程,内存都不够用。 GDI+根本不用开线程。 public partial class Chart1 : UserControl { private DateTime now; private Timer timer; public Chart1() { timer = new Timer(); timer.Tick += new EventHandler(timer1_Tick); timer.Interval = 50; timer.Enabled = true; this.DoubleBuffered = true; } static int time = 0; protected override void OnPaint(PaintEventArgs e) { Graphics g = e.Graphics; Font ft = new Font("Verdana", 10, FontStyle.Regular); SolidBrush blackBlush = new SolidBrush(Color.Black); test(ft, blackBlush, g); } private void test(Font ft, SolidBrush blackBlush, Graphics g) { if (time == 0) { DateTime dt = DateTime.Now; g.DrawString(dt.ToLongTimeString(), ft, blackBlush, 130, 154); time++; } else if (time % 20 == 0) { DateTime dt = DateTime.Now; now = dt; g.DrawString(dt.ToLongTimeString(), ft, blackBlush, 130, 154); time++; } else { g.DrawString(now.ToLongTimeString(), ft, blackBlush, 130, 154); time++; } } private void timer1_Tick(object sender, EventArgs e) { this.Invalidate(); } } 是这样效果?1秒跳一次? 您是将.refresh换成了.Invalidate么?如果是这样的话我昨天试过。。好像没有效果 是你上面的代码有问题呀,造成编译不通过吧,然后你调试的一直是错的。 onpaint = true; 《===这个没有定义 this.Refresh(); 《《这个不是这么用。 count++; 《===这个没有定义 onpaint = false; 《===这个没有定义 是你上面的代码有问题呀,造成编译不通过吧,然后你调试的一直是错的。 onpaint = true; 《===这个没有定义 this.Refresh(); 《《这个不是这么用。 count++; 《===这个没有定义 onpaint = false; 《===这个没有定义不好意思吖我有些定义是为了测试用的后来没删掉~那我现在试试看 代码在思路上是错误的,Onpaint事件,是windows事件中一种低优先级的操作,于是windows会尽可能把这个绘图事件往后推,而你的time++却正好放在这个从来不准时的OnPaint事件里处理.那不可能正确的 是你上面的代码有问题呀,造成编译不通过吧,然后你调试的一直是错的。 onpaint = true; 《===这个没有定义 this.Refresh(); 《《这个不是这么用。 count++; 《===这个没有定义 onpaint = false; 《===这个没有定义您在我之前的代码上修改了哪些啊?您的就可以用。。我的就会有延迟。 是你上面的代码有问题呀,造成编译不通过吧,然后你调试的一直是错的。 onpaint = true; 《===这个没有定义 this.Refresh(); 《《这个不是这么用。 count++; 《===这个没有定义 onpaint = false; 《===这个没有定义您在我之前的代码上修改了哪些啊?您的就可以用。。我的就会有延迟。 private DateTime now; private Timer timer; 《===这里 public Chart1() { timer = new Timer(); 《===这里 timer.Tick += new EventHandler(timer1_Tick); 《===这里 timer.Interval = 50; 《===这里 timer.Enabled = true;《===这里 this.DoubleBuffered = true; } private void timer1_Tick(object sender, EventArgs e) { this.Invalidate(); 《===这里 } 这些timer的定义可以修改的吖~不一定要用代码修改吧? 查看本机MSSQL连接池,怎么操作?谢谢 B/S的财务软件里凭证问题 sql server 像QQ一样的按钮(40分)急用 SiteMapPath 要動態生成的問題 !!! 关于C#中sqlconnection的关闭及释放问题 高手帮我看下SEO问题 菜鸟问题:我直接用记事本写了个HelloWorld.cs用.net 2003打开后,怎么启动的按纽是灰的?(我想设断点调试) 大侠救命,关于用.NET调用COM接口方法?我现在只有70分,全部给了! 关于数据库批处理的问题 一个项目创建两个服务,有点疑问 如何把.cs文件变成一个可供别人下载的应用程序
你这里
else if (time % 20 == 0)
{
DateTime dt = DateTime.Now;
now = dt;
g.DrawString(dt.ToLongTimeString(), ft, blackBlush, 130, 154);
time++;
}
time等于20次了,你应该将time等于0的吧,重新开始的
没看到你else的time++,如果你照ls的改了用this.Invalidate();调用OnPaint还延迟,我想可能是在执行重写的时候先执行基OnPaint方法,你断点看看是不是这样
{
Thread thr = new Thread(new ThreadStart(this.refresh));
thr.Start();
count++;
}
开了一个新线程之后运行了一会儿崩溃了是什么情况啊
这样当然崩溃。你会开启N个线程,内存都不够用。 GDI+根本不用开线程。
{
private DateTime now;
private Timer timer;
public Chart1()
{ timer = new Timer();
timer.Tick += new EventHandler(timer1_Tick);
timer.Interval = 50;
timer.Enabled = true;
this.DoubleBuffered = true;
}
static int time = 0;
protected override void OnPaint(PaintEventArgs e)
{
Graphics g = e.Graphics;
Font ft = new Font("Verdana", 10, FontStyle.Regular);
SolidBrush blackBlush = new SolidBrush(Color.Black);
test(ft, blackBlush, g); } private void test(Font ft, SolidBrush blackBlush, Graphics g)
{
if (time == 0)
{
DateTime dt = DateTime.Now;
g.DrawString(dt.ToLongTimeString(), ft, blackBlush, 130, 154);
time++;
}
else if (time % 20 == 0)
{
DateTime dt = DateTime.Now;
now = dt;
g.DrawString(dt.ToLongTimeString(), ft, blackBlush, 130, 154);
time++;
}
else
{
g.DrawString(now.ToLongTimeString(), ft, blackBlush, 130, 154);
time++;
}
}
private void timer1_Tick(object sender, EventArgs e)
{ this.Invalidate();
}
} 是这样效果?1秒跳一次?
是你上面的代码有问题呀,造成编译不通过吧,然后你调试的一直是错的。
onpaint = true; 《===这个没有定义
this.Refresh(); 《《这个不是这么用。
count++; 《===这个没有定义
onpaint = false; 《===这个没有定义
是你上面的代码有问题呀,造成编译不通过吧,然后你调试的一直是错的。
onpaint = true; 《===这个没有定义
this.Refresh(); 《《这个不是这么用。
count++; 《===这个没有定义
onpaint = false; 《===这个没有定义不好意思吖我有些定义是为了测试用的后来没删掉~那我现在试试看
Onpaint事件,是windows事件中一种低优先级的操作,于是windows会尽可能把这个绘图事件往后推,
而你的time++却正好放在这个从来不准时的OnPaint事件里处理.那不可能正确的
是你上面的代码有问题呀,造成编译不通过吧,然后你调试的一直是错的。
onpaint = true; 《===这个没有定义
this.Refresh(); 《《这个不是这么用。
count++; 《===这个没有定义
onpaint = false; 《===这个没有定义您在我之前的代码上修改了哪些啊?您的就可以用。。我的就会有延迟。
是你上面的代码有问题呀,造成编译不通过吧,然后你调试的一直是错的。
onpaint = true; 《===这个没有定义
this.Refresh(); 《《这个不是这么用。
count++; 《===这个没有定义
onpaint = false; 《===这个没有定义您在我之前的代码上修改了哪些啊?您的就可以用。。我的就会有延迟。
private DateTime now;
private Timer timer; 《===这里
public Chart1()
{
timer = new Timer(); 《===这里
timer.Tick += new EventHandler(timer1_Tick); 《===这里
timer.Interval = 50; 《===这里
timer.Enabled = true;《===这里
this.DoubleBuffered = true;
}
private void timer1_Tick(object sender, EventArgs e)
{
this.Invalidate(); 《===这里
}