UI的多线程问题 为什么一个线程同步了UI线程后 这个线程就一直是RUNNING的状态就是所谓的跨线程调用用控件的Invoke方法实现的 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不太明白你说的是什么,更新UI的只能由主线程去更新,不能new Thread来更新的,必须委托给主线程去更新。 当然是了,win窗体有两种,窗体的核心代码是windows的消息循环和分配,其本身就是一个进程下的线程,核心代码是:getmessage 从CPU消息泵里取消息 postmessage(可多线程) 重新投递消息 SendMessage (单线程,会形成阻塞) 执行该消息的响应如果你自己的线程代码,是在Sendmessage的窗体下执行的,那么就是死循环,很“忙”如果是在Postmessage的某一个过程中执行的,那么更多的是多个线程的交叉(同步、异步处理)给分吧,我要分下载 意思就是 我现在有个线程正在运行WINDOWS窗体 然后我又建立了一个线程,假设这个线程的名字是A,这个线程要改变WINDOWS窗体里一个控件的值 那么就是跨线程,要与创建这个控件的线程同步 也就是用INVOKE方法。。 然后同步完成并运行完后 应该返回线程A 然后线程A运行完后 那么他的状态就应该是STOPPed 可是线程A 运行完后 他的状态还是Running 意思是说他还在运行。。我就很郁闷 明明运行完了。 举个例子private void button3_Click(object sender, EventArgs e) { Thread th = new Thread(cc); th.Start(); while (true) { if (th.ThreadState == System.Threading.ThreadState.Stopped) break; } } public delegate void weituo(); private void cc() { if (button1.InvokeRequired) { weituo a = new weituo(cc); button1.Invoke(a); } else button1.Text = "1"; }调试下会发现th的状态就一直是Running状态, 怎么解决呢? 这个线程其实早就完了。 我的意见,它需要一点时间来执行把你的代码增加一点Sleep看看:Thread th = new Thread(cc); th.Start(); Thread.Sleep(2000); while (true) { if (th.ThreadState == System.Threading.ThreadState.Stopped) break; } Thread th = new Thread(cc); th.Start(); Thread.Sleep(2000);//给线程一点时间 while (true) { if (th.ThreadState == System.Threading.ThreadState.Stopped) break; } 因为所有的线程启动后都进入系统线程池由操作系统调用分配CPU时间来执行你在线程启动后,主线程直接进入一个无限循环,抢了线程的CPU时间,所以你的线程执行就不顺畅,或者在等待CPU时间面没有执行完成,导致线程状态一直是running private void cc() { if (button1.InvokeRequired) { weituo a = new weituo(cc); button1.BeginInvoke(a); } else button1.Text = "1"; } 楼上是可以吧问题解决了,而开始关键是我要让BUTTON1的值改成1以后,然后再运行UI线程。所以要在BeginInvoke后加上 EndInvoke 那么就和Invoke的效果是一样的。 新手请教:关于绘制图片的效率 怎么实现一次性上传多图片? 局域网内连接orcale字符串是什么? 请问WPF中的按钮等控件如何摆脱win7/vista自带样式 莫名其妙 数组没有申明怎么就用上了。 给客户端发消息? c# npoi怎么判断单元格是否有图片 关于Visual Studio新手问题 Asp.net中,想把图片bitmap存入到数据库,怎么处理呢? sql 按条件 删除表 多态,两个function,但里面有重覆作的事情,该怎么写好
postmessage(可多线程) 重新投递消息
SendMessage (单线程,会形成阻塞) 执行该消息的响应如果你自己的线程代码,是在Sendmessage的窗体下执行的,那么就是死循环,很“忙”如果是在Postmessage的某一个过程中执行的,那么更多的是多个线程的交叉(同步、异步处理)
给分吧,我要分下载
举个例子
private void button3_Click(object sender, EventArgs e)
{
Thread th = new Thread(cc);
th.Start();
while (true)
{
if (th.ThreadState == System.Threading.ThreadState.Stopped)
break;
}
}
public delegate void weituo();
private void cc()
{
if (button1.InvokeRequired)
{
weituo a = new weituo(cc);
button1.Invoke(a);
}
else
button1.Text = "1";
}
调试下会发现th的状态就一直是Running状态, 怎么解决呢? 这个线程其实早就完了。
把你的代码增加一点Sleep看看:Thread th = new Thread(cc);
th.Start();
Thread.Sleep(2000); while (true)
{
if (th.ThreadState == System.Threading.ThreadState.Stopped)
break;
}
th.Start();
Thread.Sleep(2000);//给线程一点时间
while (true)
{
if (th.ThreadState == System.Threading.ThreadState.Stopped)
break;
}
因为所有的线程启动后都进入系统线程池由操作系统调用分配CPU时间来执行
你在线程启动后,主线程直接进入一个无限循环,抢了线程的CPU时间,所以你的线程执行就不顺畅,或者在等待CPU时间面没有执行完成,导致线程状态一直是running
{
if (button1.InvokeRequired)
{
weituo a = new weituo(cc);
button1.BeginInvoke(a);
}
else
button1.Text = "1";
}