//描述:2个线程。线程1从1循环到10000,线程2从1循环到20000,结果分别在其下文本框中显示。
//问题:当点击[线程1-开始]按钮时,textbox1显示,立刻点击[线程2-开始]按钮,不能同时在2个文本框内显示线程的内容,而是线程1完毕之后才显示线程2的结果,为什么不能同时显示?程序中加过“Invoke()”,请大牛们帮忙! public Thread t1, t2;
public Form1()
{
InitializeComponent();
}
delegate void SetTextCallback(string text,string ss);
private void button1_Click(object sender, EventArgs e)
{ //开始
t1 = new Thread(new ThreadStart(fill_text1));
t1.Start();
this.txt_1_d1.Text = DateTime.Now.ToString("hh:mm:ss ms"); //记录开始时间
}
private void button4_Click(object sender, EventArgs e)
{//暂停线程1
if (t1.ThreadState == ThreadState.Running || t1.ThreadState==ThreadState.WaitSleepJoin) t1.Suspend();
else if (t1.ThreadState == ThreadState.Suspended) t1.Resume();
}
private void button2_Click(object sender, EventArgs e)
{ //开始2
t2 = new Thread(new ThreadStart(fill_text2));
t2.Start();
this.txt_2_d1.Text = DateTime.Now.ToString("hh:mm:ss ms"); //记录开始时间
}
private void button3_Click(object sender, EventArgs e)
{ //暂停线程2
if (t2.ThreadState == ThreadState.Running || t2.ThreadState == ThreadState.WaitSleepJoin) t2.Suspend();
else if (t2.ThreadState == ThreadState.Suspended) t2.Resume();
}
private void fill_text1()
{
for (int i = 0; i < 10000; i++)
{
if (this.textBox1.InvokeRequired)
{
Invoke( new SetTextCallback(SetText), new object[] { i.ToString(), DateTime.Now.ToString("hh:mm:ss ms") }); //
}
else SetText(i.ToString(), DateTime.Now.ToString("hh:mm:ss ms"));
}
}
private void SetText(string text,string datetimes)
{
this.textBox1.Text = text; //记录当前值
this.txt_1_d2.Text = datetimes; //记录现在时间
}
private void fill_text2()
{
int i = 0;
while (i <= 20000)
{
if (this.textBox2.InvokeRequired)
{
Invoke(new SetTextCallback(SetText2), new object[] { i.ToString(), DateTime.Now.ToString("hh:mm:ss ms") }); //
}
else SetText2(i.ToString(), DateTime.Now.ToString("hh:mm:ss ms"));
i++;
}
}
private void SetText2(string text, string datetimes)
{
this.textBox2.Text = text; //记录当前值
this.txt_2_d2.Text = datetimes; //记录现在时间
} 问题补充:控件:
textBox1 线程1的结果
textBox2 线程2的结果
button1 线程1-开始
button2 线程2-开始
button3 线程2-暂停
button4 线程1-暂停
txt_1_d1 线程1的开始时间
txt_1_d2 线程1的结束时间
txt_2_d1 线程2的开始时间
txt_2_d2 线程2的结束时间
label1 Thread-1
label2 Thread-2
//问题:当点击[线程1-开始]按钮时,textbox1显示,立刻点击[线程2-开始]按钮,不能同时在2个文本框内显示线程的内容,而是线程1完毕之后才显示线程2的结果,为什么不能同时显示?程序中加过“Invoke()”,请大牛们帮忙! public Thread t1, t2;
public Form1()
{
InitializeComponent();
}
delegate void SetTextCallback(string text,string ss);
private void button1_Click(object sender, EventArgs e)
{ //开始
t1 = new Thread(new ThreadStart(fill_text1));
t1.Start();
this.txt_1_d1.Text = DateTime.Now.ToString("hh:mm:ss ms"); //记录开始时间
}
private void button4_Click(object sender, EventArgs e)
{//暂停线程1
if (t1.ThreadState == ThreadState.Running || t1.ThreadState==ThreadState.WaitSleepJoin) t1.Suspend();
else if (t1.ThreadState == ThreadState.Suspended) t1.Resume();
}
private void button2_Click(object sender, EventArgs e)
{ //开始2
t2 = new Thread(new ThreadStart(fill_text2));
t2.Start();
this.txt_2_d1.Text = DateTime.Now.ToString("hh:mm:ss ms"); //记录开始时间
}
private void button3_Click(object sender, EventArgs e)
{ //暂停线程2
if (t2.ThreadState == ThreadState.Running || t2.ThreadState == ThreadState.WaitSleepJoin) t2.Suspend();
else if (t2.ThreadState == ThreadState.Suspended) t2.Resume();
}
private void fill_text1()
{
for (int i = 0; i < 10000; i++)
{
if (this.textBox1.InvokeRequired)
{
Invoke( new SetTextCallback(SetText), new object[] { i.ToString(), DateTime.Now.ToString("hh:mm:ss ms") }); //
}
else SetText(i.ToString(), DateTime.Now.ToString("hh:mm:ss ms"));
}
}
private void SetText(string text,string datetimes)
{
this.textBox1.Text = text; //记录当前值
this.txt_1_d2.Text = datetimes; //记录现在时间
}
private void fill_text2()
{
int i = 0;
while (i <= 20000)
{
if (this.textBox2.InvokeRequired)
{
Invoke(new SetTextCallback(SetText2), new object[] { i.ToString(), DateTime.Now.ToString("hh:mm:ss ms") }); //
}
else SetText2(i.ToString(), DateTime.Now.ToString("hh:mm:ss ms"));
i++;
}
}
private void SetText2(string text, string datetimes)
{
this.textBox2.Text = text; //记录当前值
this.txt_2_d2.Text = datetimes; //记录现在时间
} 问题补充:控件:
textBox1 线程1的结果
textBox2 线程2的结果
button1 线程1-开始
button2 线程2-开始
button3 线程2-暂停
button4 线程1-暂停
txt_1_d1 线程1的开始时间
txt_1_d2 线程1的结束时间
txt_2_d1 线程2的开始时间
txt_2_d2 线程2的结束时间
label1 Thread-1
label2 Thread-2
解决方案 »
- c#中获取焦点位置,然后回车出相应的事件
- sql2008的数据库备份导入sql2005出现 acb.bak 上的媒体簇的布局不正确。SQL Server 无法措置此媒体簇。各位有什么好方法吗?
- 再帮一次?
- 网页抓取修改转发
- File.ReadAllText乱码用StreamReader读取中文是同样是乱码
- 怎样在DataGridView的DataGridViewComboBoxColumn的下拉列中加入多个图片?
- 关于JS生成的数据导致查看源代码无法看到,如何能查看?
- 用户sa登录失败!
- 如何使用C#接收麦克风声音并实时分析主音高?声音可视化
- ASP.NEt“/Web_01”应用程序中的服务器错误。
- WCF的若干问题,恳请各位近来指教一二!
- c#中,为何可以将main()函数放在一个类中呢?这是c++中是不允许的呀?为何c#中却可以呢?
{
for (int i = 0; i < 10000; i++)
{
SetText(i.ToString(), DateTime.Now.ToString("hh:mm:ss ms"));
Thread.Sleep(100);
}
}
private void SetText(string text,string datetimes)
{
if (this.InvokeRequired)
{
this.Invoke(new SetTextCallback(SetText), new object[] {text,datetimes }); //
}
else
{ this.textBox1.Text = text; //记录当前值
this.txt_1_d2.Text = datetimes; //记录现在时间
}
}
private void fill_text2()
{
int i = 0;
while (i <= 20000)
{
SetText2(i.ToString(), DateTime.Now.ToString("hh:mm:ss ms"));
Thread.Sleep(100);
i++;
}
}
private void SetText2(string text, string datetimes)
{
if (this.InvokeRequired)
{
this.Invoke(new SetTextCallback(SetText2), new object[] { text, datetimes }); //
}
else
{
this.textBox2.Text = text; //记录当前值
this.txt_2_d2.Text = datetimes; //记录现在时间
}
}