上次关于线程的问题还未解决,又要问线程的问题了。
这段代码,t1和t2作为两个线程运行的时候,控件Label显示是没有问题的;
但不进行双线程运行,单单运行主线程的时候,控件Label(lbl1)却不能正常显示运行结果。
到底是怎么回事呢?唉,好头痛!
谢谢!
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;namespace test
{
public partial class Form1 : Form
{
Thread t1, t2;
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
} //这是单线程(主线程)运行
private void btnStart_Click(object sender, EventArgs e)
{
for (int i = 0; i < 200; i++)
{
lbl1.Text = i.ToString();
Thread.Sleep(50);
}
} //下面是双线程运行
private void btnStartTwo_Click(object sender, EventArgs e)
{
t1 = new Thread(new ThreadStart(runLbl1));
t2 = new Thread(new ThreadStart(runLbl2));
t1.Start();
t2.Start();
} private void runLbl1()
{
for (int i = 0; i < 100; i++)
{
lbl1.Text = i.ToString();
Thread.Sleep(50);
}
} private void runLbl2()
{
for (int i = 100; i > 0; i--)
{
lbl2.Text = i.ToString();
Thread.Sleep(50);
}
}
}
}
这段代码,t1和t2作为两个线程运行的时候,控件Label显示是没有问题的;
但不进行双线程运行,单单运行主线程的时候,控件Label(lbl1)却不能正常显示运行结果。
到底是怎么回事呢?唉,好头痛!
谢谢!
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;namespace test
{
public partial class Form1 : Form
{
Thread t1, t2;
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
} //这是单线程(主线程)运行
private void btnStart_Click(object sender, EventArgs e)
{
for (int i = 0; i < 200; i++)
{
lbl1.Text = i.ToString();
Thread.Sleep(50);
}
} //下面是双线程运行
private void btnStartTwo_Click(object sender, EventArgs e)
{
t1 = new Thread(new ThreadStart(runLbl1));
t2 = new Thread(new ThreadStart(runLbl2));
t1.Start();
t2.Start();
} private void runLbl1()
{
for (int i = 0; i < 100; i++)
{
lbl1.Text = i.ToString();
Thread.Sleep(50);
}
} private void runLbl2()
{
for (int i = 100; i > 0; i--)
{
lbl2.Text = i.ToString();
Thread.Sleep(50);
}
}
}
}
lbl1.Update();
Thread.Sleep(50);
修改Label的Text属性之后如果不执行Update则要等到线程接到消息时才会刷新,因为你的程序一直没有返回,所以没有刷新的机会。
单线程:第一个label最后显示199
双线程:第一个label显示99,第二个label显示1
正确的做法是,主界面只负责界面,业务逻辑的计算放在子线程里面
txt1.Text = (++i).ToString();
Thread.Sleep(500);
lbl1.Text = 3.ToString();
Thread.Sleep(500);
lbl1.Text = "A";
Thread.Sleep(500);
txt1.Text = "B";
Thread.Sleep(500);今天看到各位的答复,才知道是什么回事。我还特意用JAVA2005试了一次,也是这个样子。但用update更新不了,不知道是不是我没有用对参数。
谢谢各位。派分结贴。