formLoad事件之后不停的刷新显示的数据,碰到的问题

yilaozhuang 2010-01-25 10:32:58
我在form上创建了两个label控件,现在想实现在label2控件上不停的刷新显示随机产生的数字。原理很简单,可是我碰到一些问题,请高手给分析下我错在哪里了?
程序如下:如果不用while (b){}可以显示数据,但是不能不停的刷新;我把while (b) {}加上之后就没有反应了,按F5之后连窗体都出不来了,请高手给分析下错在哪里了,谢谢!


private void Form1_Load(object sender, EventArgs e)
{

double vol;
bool b = true;
while (b)
{
Random V = new Random();
vol = V.Next(0, 300);
label2.Text = vol.ToString();
System.Threading.Thread.Sleep(100);
}
...全文
158 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
cj548820 2010-01-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xsi640 的回复:]
你在主线程上创建了死循环。。窗体当然不动了。
C# codeprivatevoid Form1_Load(object sender, EventArgs e)
{
Thread thread=new Thread(new ThreadStart(Run));
thread.Start();
}privatevoid Run()
{while (true)
{
Random rand=new Random();this.label1.Text= rand.Next(0,300).ToString();
Thread.Sleep(100);
}
}
[/Quote]
没错
a7373773 2010-01-25
  • 打赏
  • 举报
回复
用Time 控件即可
wheeler 2010-01-25
  • 打赏
  • 举报
回复
1楼正解
LuDeGo 2010-01-25
  • 打赏
  • 举报
回复
private void Form1_Load(object sender, EventArgs e)
{

double vol;
bool b = true;
while (b)
{
Application.DoEvents();
Random V = new Random();
vol = V.Next(0, 300);
label2.Text = vol.ToString();
System.Threading.Thread.Sleep(100);
}
ztenv 2010-01-25
  • 打赏
  • 举报
回复
while (b)
{
Random V = new Random();
vol = V.Next(0, 300);
label2.Text = vol.ToString();
System.Threading.Thread.Sleep(100);
}//主线程一直阻在这里了。。。。不能继续执行
xsi640 2010-01-25
  • 打赏
  • 举报
回复
你在主线程上创建了死循环。。窗体当然不动了。


private void Form1_Load(object sender, EventArgs e)
{
Thread thread = new Thread(new ThreadStart(Run));
thread.Start();
}

private void Run()
{
while (true)
{
Random rand = new Random();
this.label1.Text = rand.Next(0, 300).ToString();
Thread.Sleep(100);
}
}
ztenv 2010-01-25
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 xiaohuliwql 的回复:]
在构造函数 InitializeComponent();下面加一句话
Control.CheckForIllegalCrossThreadCalls = false;
[/Quote]
用吧,用多了就知道了。。。使劲的用吧
yilaozhuang 2010-01-25
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 xiaohuliwql 的回复:]
在构造函数 InitializeComponent();下面加一句话
Control.CheckForIllegalCrossThreadCalls = false;
[/Quote]
高人啊,我查了一下,多数都是用下面的方式来实现:
1.增加一个

delegate void SetVisibleDelegate();

2.新加一个函数

privare void sinvoke()

{

this.Invoke(new SetVisibleDelegate(s))

}

3.之后重新调用

private void showtable_btn_Click(object sender, EventArgs e)

{

thread t = new thead(sinvoke)

t.start()

}

zdl110110 2010-01-25
  • 打赏
  • 举报
回复
用timer刷新比较省事吧
ssdest 2010-01-25
  • 打赏
  • 举报
回复
在构造函数 InitializeComponent();下面加一句话
Control.CheckForIllegalCrossThreadCalls = false;
岁月如刀 2010-01-25
  • 打赏
  • 举报
回复
用 timer .实时刷新
huyou1983218 2010-01-25
  • 打赏
  • 举报
回复
Thread
或Timer
lowtemper 2010-01-25
  • 打赏
  • 举报
回复
你创建的主线程中有label1,附加的线程中又没有label1,当然出错啦
yilaozhuang 2010-01-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xsi640 的回复:]
你在主线程上创建了死循环。。窗体当然不动了。
C# codeprivatevoid Form1_Load(object sender, EventArgs e)
{
Thread thread=new Thread(new ThreadStart(Run));
thread.Start();
}privatevoid Run()
{while (true)
{
Random rand=new Random();this.label1.Text= rand.Next(0,300).ToString();
Thread.Sleep(100);
}
}
[/Quote]

感谢三楼的回答,我把你的代码运行了一下,出现了新的问题,下面是提示的错误:
未处理的“System.InvalidOperationException”类型的异常出现在 System.Windows.Forms.dll 中。
其他信息: 线程间操作无效: 从不是创建控件“label1”的线程访问它。

这该怎么修改呢?还请高手指点一下

111,122

社区成员

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

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

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