C# 窗口刷新太快 导致控件无效

beijixiong2000 2012-08-29 01:32:28
我现在有一个窗口,这个窗口内的数据在不断的刷新,刷新的速度是1ms一次(很快); 然后我在这个窗口上放了2个按钮;

我的问题来了,当我把窗口打开,让这个窗口开始1ms刷新一次数据的时候,我发现窗口上的其他控件全都“无效了”,只要点击二个按钮中的任意一个,窗口就会死掉(未响应),本来刷新的数据也不刷新了,窗口“死掉”了;

但是如果不点这些按钮,窗口就一直可以正常刷新(没死掉);

请问这是为什么?

是窗口的重画太快了,导致其他控件无法使用吗
...全文
652 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
beijixiong2000 2012-08-30
  • 打赏
  • 举报
回复
嗯 Java_Script__给的代码我差不多能够看懂

我回去试试先

感谢大家的热心回复
Delta 2012-08-30
  • 打赏
  • 举报
回复
应该使用异步执行操作。
Just4life 2012-08-29
  • 打赏
  • 举报
回复
1MS一次 你能分辨出来显示的东西么?
嘶吼的蚂蚁 2012-08-29
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Timers;

namespace WindowsApplication1
{
public partial class Form1 : Form
{

int number = 0;
private System.Timers.Timer timer = new System.Timers.Timer(1);

public Form1()
{
InitializeComponent();
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
}


private void Form1_Load(object sender, EventArgs e)
{
timer.Enabled = true;
}

void timer_Elapsed(object sender, ElapsedEventArgs e)
{
this.Invoke((EventHandler)delegate
{
button1.Text = "按钮" + number;
});
number++;
Thread.Sleep(1000);
}

private void button2_Click(object sender, EventArgs e)
{
Thread th = new Thread(delegate()
{
NewMethod();
});
th.Start();

}

private static void NewMethod()
{
for (int i = 0; i < 10000; i++)
{
Console.WriteLine(i);
}
}

}
}

创建一个窗体,拖2个button上去。button2分别注册对应的button2_Click(object sender, EventArgs e)事件!运行后点击button1看看。timer每1毫秒更新数据的同事阻塞线程1000毫秒,点击button2看看,会不会假死!~
嘶吼的蚂蚁 2012-08-29
  • 打赏
  • 举报
回复
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
int number = 0;

private void Form1_Load(object sender, EventArgs e)
{
timer1.Enabled = true;
}

private void timer1_Tick(object sender, EventArgs e)
{
button1.Text = "按钮" + number;
number++;
}

private void button2_Click(object sender, EventArgs e)
{
Thread th = new Thread(delegate()
{
NewMethod();
});
th.Start();

}

private static void NewMethod()
{
for (int i = 0; i < 10000; i++)
{
Console.WriteLine(i);
}
}

private void button1_Click(object sender, EventArgs e)
{
timer1.Enabled = false;
}


}
c2606050113 2012-08-29
  • 打赏
  • 举报
回复
窗体的timer组件是单线程,是UI线程执行方法体的,肯定会阻塞

[Quote=引用 16 楼 的回复:]

引用 1 楼 的回复:

刷新太快,获取数据太慢,放到异步执行,timer是会阻塞主线程的

timer会阻塞主线程?我第一次听说!你将button事件里面的代码提取成方法,然后用线程去执行!保证你的没有问题,如果你button事件里面的代码也会刷新界面的话,就用委托去刷新界面!
[/Quote]
嘶吼的蚂蚁 2012-08-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

刷新太快,获取数据太慢,放到异步执行,timer是会阻塞主线程的
[/Quote]
timer会阻塞主线程?我第一次听说!你将button事件里面的代码提取成方法,然后用线程去执行!保证你的没有问题,如果你button事件里面的代码也会刷新界面的话,就用委托去刷新界面!
c2606050113 2012-08-29
  • 打赏
  • 举报
回复
多线程示例:

Thread th = new Thread((ThreadStart)delegate()
{
test();
});
th.Start();
public void test()
{
int i=0;
while (i<100000)
{
this.Invoke
(
(MethodInvoker)delegate()
{
label1.Text = i.ToString();
}
);
i += 100;
}
}
FoxStatue_007 2012-08-29
  • 打赏
  • 举报
回复
干嘛非得整个窗体刷新,而不是涉及到数据的地方刷新呢?
beijixiong2000 2012-08-29
  • 打赏
  • 举报
回复
敢问怎么才能分线程去做呢?

我知道现在的方法(单线程接收,然后处理)肯定是不行了,那么怎么才能分线程去做呢?

能否说的详细一点?

小弟我新手啊

备注:项目中用到的通讯时CANOpen,故能达到1ms一个点; 如果用到了USB,那么会更快,一秒钟16K的点
Castiel丶Luo 2012-08-29
  • 打赏
  • 举报
回复
分线程去做
放在主线程必然假死
cheng2005 2012-08-29
  • 打赏
  • 举报
回复
1ms一次,相对于一个1000帧的视频。现在的电影是24帧,你刷新的频率的是1000次/秒。你觉得有必要吗?
c2606050113 2012-08-29
  • 打赏
  • 举报
回复
不是重画太快,你设置的再慢也应该无法使用,UI主线程忙的时候,窗体上的所有控件都会假死
只能用多线程或者异步,单线程不支持你的要求
[Quote=引用楼主 的回复:]
是窗口的重画太快了,导致其他控件无法使用吗?
[/Quote]
leiziaitudou 2012-08-29
  • 打赏
  • 举报
回复
多线程么。。。。。
liangbudao 2012-08-29
  • 打赏
  • 举报
回复
最好在子线程处理完了直呼在绘制到窗体上
beijixiong2000 2012-08-29
  • 打赏
  • 举报
回复
请教各位高手 是不是接收数据在主线程 而画图要在另外一个异步的线程中?

这两个线程是异步的关系??
lqkankan 2012-08-29
  • 打赏
  • 举报
回复
1秒刷新 1000次 这是要做甚?

另外 这个你得打断点看一下

最好是用多线程
beijixiong2000 2012-08-29
  • 打赏
  • 举报
回复
不好意思 我说的不够全面,这些1ms刷新的数据就是DSP给我的;

DSP以1ms的周期给我数据,我就以1ms的速度来画出来

在这种情况下,1ms的画画刷新窗口下, 其他控件都好像“死掉了”;

而且我又发现,我用zedgraph来讲这些数据画出来,如果DSP以100ms的速度给我数据,我再以100ms的速度来画的话,没有问题;

但是如果DSP以1ms的速度给我数据,我再以1ms的速度来画的话,zedgraph在画了将近10000个点的时候就会“死掉”,其他啥都没干,程序自动死掉了;

我是在一个线程里面做的,1ms收完后,1ms画出来(只有1条曲线)

请问这是为什么?
niaoked 2012-08-29
  • 打赏
  • 举报
回复
有必要1MS刷新一次吗?
人眼能感觉到的变化最小也得间隔0.1秒呀。
只在此山中 2012-08-29
  • 打赏
  • 举报
回复
建议贴代码出来
加载更多回复(1)

110,546

社区成员

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

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

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