[已解决问题] 进度条再运行时,卡界面,无法运行其它操作(我开新线程了)
提问时间: 2008-08-20 10:01
悬赏分:50 浏览:379 次

 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++)
            {if (InvokeRequired)
                {                
                     BeginInvoke(new UpProgressDelegate(LongProcess));
                     return;
                }
            this.progressBar1.Value = i;   }
}
进度条在运行时,其它窗体控件不能使用...只能等到进度条运行完后,才能使用,我这里开线程了,还有就是我回到UI所在线程修改控件是不是造成卡死的原因啊,请高手指点啊,并给出好的意见,最好给个小例子!可以追加分数!

 


问题补充:果然不出我说的....出异常了
Undo 操作遇到的上下文与相应 Set 操作中应用的上下文不同。可是因为在线程上 Set 了一个上下文但未进行还原(撤消)。
ProgressBar.CheckForIllegalCrossThreadCalls = false;这个方法,在多线程的情况下,不稳定啊...容易出异常啊,
还有没有别的方法啊,高手快点指点一下啊

最佳答案
去掉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; } }
2008/8/20 11:05:41 回答者:侯垒


提问者对于答案的评价:先用这个试试
其它回答(2)
我也遇到这个情况,整个白屏。关注中。
3个月前   回答者:apan - 初学一级
下面是典型的多线程操作界面的例子,我按照你的要求改了,已经测试过, 界面不会卡住 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); } } }
3个月前   回答者:eaglet - 老鸟四级
评论
3个月前   体育皇帝 :
ProgressBar.CheckForIllegalCrossThreadCalls = false; 控件没有这个属性啊,去掉join(),也不好使!
另外,这个是winform,不能从不是创建控件“progressBar1”的线程访问它
3个月前   侯垒 :
ProgressBar有这个属性.自己在代码里写就行了.
我写的是ProgressBar而不是this.progressBar1
你可以再试一下.
3个月前   体育皇帝 :
你这个方法是不捕获对错误线程的调用,简单的小程序用用可以,如果比较复杂的程序用的话,是不是有什么隐患啊?
   您需要登录以后才能回答!
 

我要提问

我的问题


快到期问题



> 问题排行榜

相关内容

相关链接