"多线程跨窗体传值?"

OROCHIORI514 2009-12-24 03:18:23
由于初次加载的东西过多,所以点击窗体上的"连接"按钮的时候,窗体会硬直两分钟左右。之前想过弹出另一个窗体用个假进度条的办法来掩盖主窗体硬直,但没能做到这一点(弹出的新窗体进度条也跟着硬了)。
找到了一个能勉强混过关的办法.

在主窗体拖一个BackgroundWorker.
BackgroundWorker的两个事件代码如下:


public decimal Idx;
public decimal Maximum = 500000;
public Form2 bbb;

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
decimal ThisMaxValue = Maximum;
if (e.Argument != null && e.Argument is decimal)
ThisMaxValue = (decimal)e.Argument;
//This run in a new thread
for (int i = 0; i <= ThisMaxValue; i++)
{
Idx = i;
}
}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (LoadingForm != null && LoadingForm.Visible)//主窗体硬直结束后发生
{
Form1 aaa = new Form1();
aaa.Show();
LoadingForm.Dispose();
}
}

然后主窗体中的Click事件写的如下

private void button4_Click(object sender, EventArgs e)
{
button1.Enabled =False;//问题所在
backgroundWorker1.RunWorkerAsync();
bbb = new Form2();
bbb.ShowDialog();
}

然后把Form2中的窗口外观属性改成None(就是光秃秃的啥也没有的那个..最大化最小化啥的都没有),然后把透明度调成80%(汗!如果百分之百还是硬直)..

这样就实现了 当点击"连接"按钮的时候,弹出Form2而且也不会硬直(至少看上去还有鼠标点上去不会有硬直表现).当主窗体硬直结束回复正常的时候,该窗体自动关闭!

但随着出现了一个新问题,就是在主窗体中button4_Click事件中已经定义了button1.Enabled =False; 但是当硬直恢复以后(既Form2自动关闭以后),button1居然还是允许点击的。不知道这个问题怎样解决。
希望高手能帮帮忙
感激!!感激!!!!
...全文
178 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
ztenv 2009-12-25
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 orochiori514 的回复:]
谢谢楼上各位 问题暂未解决 先结贴吧我好好学习一下
[/Quote]

切记一点:耗时的工作放到线程中去做,如果放在主线程中做会让界面假死的;
OROCHIORI514 2009-12-25
  • 打赏
  • 举报
回复
谢谢楼上各位 问题暂未解决 先结贴吧我好好学习一下
yang_xingxing88 2009-12-24
  • 打赏
  • 举报
回复
up
xuetianliang 2009-12-24
  • 打赏
  • 举报
回复
我试了代码。未发现您说的问题,BUTTON1在点击BUTTON4的时候就已经不可以使用,建议你在这button1.Enabled =False(写错了哟,False的F应该是小写的,哈哈);添加一下断点看下值。然后如果你想把button1在Form2里用的话,添加一个静态类,把这个实例放在里面就可以用了。
zenowolf 2009-12-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 lianshaohua 的回复:]
最好的办法是,把这两分钟要做的事情放到一个线程中去做,线程启动后,再显示人的假窗体,线程完成时,用事件通知主线程,关闭此假窗体,这就做到了。。。
[/Quote]
up~有道理,建议 假窗体也 开一个线程,然后 用 thread(两分钟要做的事情).join() 等待其做完后,自己Close.
主线程 就等待 假窗体线程.join()
不知道如何?
平生我自如 2009-12-24
  • 打赏
  • 举报
回复
upup
ztenv 2009-12-24
  • 打赏
  • 举报
回复
最好的办法是,把这两分钟要做的事情放到一个线程中去做,线程启动后,再显示人的假窗体,线程完成时,用事件通知主线程,关闭此假窗体,这就做到了。。。
OROCHIORI514 2009-12-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 songhtao 的回复:]
button1.visible = false;
[/Quote]
不行啊 测几遍了
OROCHIORI514 2009-12-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 momo400 的回复:]
backgroundWorker1_RunWorkerCompleted
里可以用Invoke让button1.visible = false; 应该可以实现吧
[/Quote]
放backgroundWorker1_RunWorkerCompleted里不行
Invoke啥意思?
MOmo400 2009-12-24
  • 打赏
  • 举报
回复
backgroundWorker1_RunWorkerCompleted
里可以用Invoke让button1.visible = false; 应该可以实现吧
OROCHIORI514 2009-12-24
  • 打赏
  • 举报
回复

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (Form2!= null && Form2.Visible)//主窗体硬直结束后发生
{
Form1 aaa = new Form1();
aaa.Show();
Form2.Dispose();
}
}

修正下几行
MOmo400 2009-12-24
  • 打赏
  • 举报
回复
哈哈.为了这个硬直我也帮顶
我不懂电脑 2009-12-24
  • 打赏
  • 举报
回复
button1.visible = false;
silentwins 2009-12-24
  • 打赏
  • 举报
回复
为了硬直而帮顶...
liherun 2009-12-24
  • 打赏
  • 举报
回复
学习
tzs2304 2009-12-24
  • 打赏
  • 举报
回复
up

111,122

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧