首页 新闻 会员 周边 捐助

进度条再运行时,卡界面,无法运行其它操作(我开新线程了)

0
悬赏园豆:50 [已解决问题] 解决于 2008-08-28 15:09
<P>&nbsp;private void btnSearch_Click(object sender, EventArgs e)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.progressBar1.Maximum = 9000;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; progressBar1.Minimum = 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; progressBar1.MarqueeAnimationSpeed = 1000;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread tt = new Thread(new ThreadStart(LongProcess));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tt.Start();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tt.Join();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;                                private void LongProcess()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; 9000; i++)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {if (InvokeRequired)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BeginInvoke(new UpProgressDelegate(LongProcess));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.progressBar1.Value = i;&nbsp;&nbsp;&nbsp;}<BR>}<BR>进度条在运行时,其它窗体控件不能使用...只能等到进度条运行完后,才能使用,我这里开线程了,还有就是我回到UI所在线程修改控件是不是造成卡死的原因啊,请高手指点啊,并给出好的意见,最好给个小例子!可以追加分数!</P> <P mce_keep="true">&nbsp;</P>
问题补充: 果然不出我说的....出异常了 Undo 操作遇到的上下文与相应 Set 操作中应用的上下文不同。可是因为在线程上 Set 了一个上下文但未进行还原(撤消)。 ProgressBar.CheckForIllegalCrossThreadCalls = false;这个方法,在多线程的情况下,不稳定啊...容易出异常啊, 还有没有别的方法啊,高手快点指点一下啊
体育皇帝的主页 体育皇帝 | 初学一级 | 园豆:-5
提问于:2008-08-20 10:01
< >
分享
最佳答案
0
去掉tt.Join(); 因为tt.Join()阻塞了主线程,所以界面会卡. 可以这样写代码: private void Form1_Load(object sender, EventArgs e) { ProgressBar.CheckForIllegalCrossThreadCalls = false; } private void btnSearch_Click(object sender, EventArgs e) { this.progressBar1.Maximum = 9000; progressBar1.Minimum = 0; progressBar1.MarqueeAnimationSpeed = 1000; Thread tt = new Thread(new ThreadStart(LongProcess)); tt.Start(); // tt.Join(); } private void LongProcess() { for (int i = 0; i < 9000; i++) { this.progressBar1.Value = i; } }
侯垒 | 老鸟四级 |园豆:3435 | 2008-08-20 11:05
其他回答(2)
0
我也遇到这个情况,整个白屏。关注中。
apan | 园豆:190 (初学一级) | 2008-08-20 10:21
0
下面是典型的多线程操作界面的例子,我按照你的要求改了,已经测试过, 界面不会卡住 private void buttonSearch_Click(object sender, EventArgs e) { this.progressBar1.Maximum = 9000; progressBar1.Minimum = 0; progressBar1.MarqueeAnimationSpeed = 1000; Thread tt = new Thread(new ThreadStart(LongProcess)); tt.IsBackground = true; tt.Start(); } delegate void UpProgressDelegate(int value); void ProgressIncrease(int value) { this.progressBar1.Value = value; } void LongProcess() { for (int i = 0; i < 9000; i++) { //Do something Thread.Sleep(10); //在这里做一些需要在线程中做的长时间操作,这里用休眠10ms来模拟。 //Porogress Increase if (progressBar1.InvokeRequired) { progressBar1.Invoke(new UpProgressDelegate(ProgressIncrease), new object[] { i }); } else { ProgressIncrease(i); } } }
eaglet | 园豆:17139 (专家六级) | 2008-08-20 12:56
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册