线程的简单的问题!!【在线等!!】

Hellonet123 2009-04-29 12:10:03
上个贴子问了没答案,重新发贴
这次说简单点就是有三个窗体A、B和等窗体
在A窗体上面有一个按钮,点击按钮弹出B窗体,因为B窗体上面的控件较多,加载比较慢,所以这时要利用一个等待窗体
也就是点击A窗体的按钮时,要开两个线程,一个是打开等待窗体,一个是打开B窗体,然后在B窗体的LoadForm事件里面(也就是B窗体已经加载好了)把打开等待窗体的事件停止,同时关闭等待窗体
请高手支支招啊.给点代码就更好了,非常感谢!
...全文
175 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hellonet123 2009-04-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 qqiuzaihui 的回复:]
二楼所言甚是, 支持二楼.
[/Quote]
那样不行的,你试试就知道了
qqiuzaihui 2009-04-29
  • 打赏
  • 举报
回复
二楼所言甚是, 支持二楼.
Hellonet123 2009-04-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cpio 的回复:]
不需要线程吧,在B窗口的构造函数里面,打开C窗口,在B窗口的Load事件里面把C窗口关了就行了吧
[/Quote]
如果不用线程的话界面就像假死一样,那样不好,所以想用线程来做
Hellonet123 2009-04-29
  • 打赏
  • 举报
回复
谢谢帮顶.
继续UP
cpio 2009-04-29
  • 打赏
  • 举报
回复
不需要线程吧,在B窗口的构造函数里面,打开C窗口,在B窗口的Load事件里面把C窗口关了就行了吧
xuezhanliang6886 2009-04-29
  • 打赏
  • 举报
回复
顶顶顶!!希望高手能支招!
marvelstack 2009-04-29
  • 打赏
  • 举报
回复
楼主,先矫正一下您的一些问题的问题,你所说的开线程不应该是开线程来打开窗体,使用非UI线程来操作UI元素本身就是一下错误,正确的应用做法是如果数据处理逻辑复杂,比如访问数据库,还需要进行复杂计算,最后把结果显示到窗体上,那么访问数据库和进行复杂计算的操作可以使用另外的线程来做,但是你还是需要通过异步委托等方式来把其他线程的数据设置显示到窗体具体控件中,在你上一帖中我已经推荐你使用BackgroundWorker来做再合适不过,不过你现在的问题其实不是B窗体加载前逻辑复杂,而是窗体控件太多导致显示慢(虽然这样情况不太可能发生),不过想显示等待窗体跟线程关联反而会有问题,其实说透了就好比是vs或office启动的时候显示启动画面的处理方式一样
启动画面实现的代码不少,不过还是根据你的题意给你写个demo.


public partial class Form1 : Form
{
Form formWaiting;
public Form1()
{
InitializeComponent();
}

//A窗体中的按钮事件
private void button1_Click(object sender, EventArgs e)
{
formWaiting = new Form("等待窗体");//初始化等待窗体
formWaiting.Show(this);//非模态,可以设置父窗体属性

Form formB = new Form("FormB");//初始化很慢的B窗体。
formB.Load += new EventHandler(formB_Load);
formB.Shown += new EventHandler(formB_Shown);
}

//B 窗体中的加载事件
void formB_Load(object sender, EventArgs e)
{
formWaiting.Close();//关闭等待窗体。
}
//你也可以在B窗体的Shown事件中处理
void formB_Shown(object sender, EventArgs e)
{
//formWaiting.Close();
}
}


如果对于窗体之间的交互有问题,可参考
http://blog.csdn.net/zhzuo/archive/2004/04/05/22027.aspx
http://blog.csdn.net/zhzuo/archive/2006/05/05/708941.aspx
Hellonet123 2009-04-29
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 maplesept 的回复:]
主窗体:
public static bool isInited=false;
wait _formWait = null;
Form2 _form2 = null;
delegate void DeleGeneral();
private void button1_Click(object sender, EventArgs e)
{
Thread threadMonitor = new Thread(new ThreadStart(Monitor));
threadMonitor.Start();

Thread thread = new Thread(new Threa…
[/Quote]
已经改好了,你这方法可行,非常感谢,结贴了
Hellonet123 2009-04-29
  • 打赏
  • 举报
回复
TO maplesept
这个还是不对哦,这样子的话Form2根本加载不完
bwangel 2009-04-29
  • 打赏
  • 举报
回复
如果不追求效果,可以不用线程,如果追求效果,线程是非用不可的.
但不赞成在Form C的构造函数里弄B的方法.那样会使B和C的藕合非常严重.
不用线程:
FormC formC = new FormC();
FormC.Load += delegate(object sender,EventArgs e)
{
FormB formB = new FormB();
formB.Show();
}

FormB.Show();
FormB.Update();

FormB.Close();

用线程就稍复杂一些.
LemIST 2009-04-29
  • 打赏
  • 举报
回复
窗体A
{


button_Click
{
创建一个线程打开等待窗体, 等待窗体实例为WaitForm
打开窗体B, formB
formB.Loaded += ...(FormBLoaded);
}
FormBLoaded
{
WaitForm.Close();
}
}

窗体B

  定义事件 Loaded
public FormB()
{
//初始化
     Loaded.Invoke();
}
EsMo 2009-04-29
  • 打赏
  • 举报
回复
其实最简单的
启动窗体b
改变鼠标指针图标为等待
然后启动完了改回来
m78587408 2009-04-29
  • 打赏
  • 举报
回复
可以考虑这种方式.
A直接打开B窗口,
在B窗口的Load事件里打开等待窗口,
在B窗口的Shown事件里关闭等待窗口
EsMo 2009-04-29
  • 打赏
  • 举报
回复
启动窗体b
1 打开等待窗口
2 用委托的.begininvoke方法 去load窗体b
3 在回调方法里endinvoke后面添加关闭等待窗体的代码
maplesept 2009-04-29
  • 打赏
  • 举报
回复
主窗体:
public static bool isInited=false;
wait _formWait = null;
Form2 _form2 = null;
delegate void DeleGeneral();
private void button1_Click(object sender, EventArgs e)
{
Thread threadMonitor = new Thread(new ThreadStart(Monitor));
threadMonitor.Start();

Thread thread = new Thread(new ThreadStart(ShowForm2));
thread.Start();

WaitShowEvent();
//下面这个由于已经弹出窗体,只有等窗体关闭时,才会执行
_form2.ShowDialog();
}

//等待窗口显示
private void WaitShowEvent()
{
_formWait = new wait();
_formWait.ShowDialog();
}
//等待窗口关闭,需要用委托
private void WaitCloseEvent()
{
_formWait.Close();
Thread.Sleep(10);
}

private void ShowForm2()
{
Thread.Sleep(1000);

if (_form2 == null)
{
_form2 = new Form2();

}
_form2.Init();
}
//监视事件,监视窗体是否已经实例完成,或者可以用TIMER控件,更简单
private void Monitor()
{
while (true)
{
if (isInited)
{
isInited = false;
this.BeginInvoke(new DeleGeneral(WaitCloseEvent));
break;
}
Thread.Sleep(50);
}
}

需要打开的窗体:
public Form2()
{

}

public void Init()
{
InitializeComponent();
Form1.isInited = true;
}

等待窗体就不贴了,把窗体的样式设成NONE就行。


写的比较急,命名比较乱,领会精神就行,嘿嘿
NeptuneGrass 2009-04-29
  • 打赏
  • 举报
回复
booker 2009-04-29
  • 打赏
  • 举报
回复
最简单的办法,在B窗体load事件中建立backgroundworker,在backgroundworker中打开等待窗体,等B窗体加载完毕后结束这个backgroundworker就可以了
Hellonet123 2009-04-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zhantianyou 的回复:]
先Sublayout()
再Resumlay()大概這個吧.如果用線程的話,有問題吧.涉及到跨線程的問題.我這樣理解的,沒去做過.不過之前也是控件多,換的時候閃得歷害,我就是用這個方法做的
[/Quote]
跨线程是有办法的啊,关键是我想要一个等待效果的窗体,你这样的话不能加一个效果呢,这样用户体验不好
我加一个等待窗体,让用户视觉上好些
Hellonet123 2009-04-29
  • 打赏
  • 举报
回复
如果像二楼那样做的话,我在等待窗体上面写了文字和图片,根据出不本,就一个白板,然后就打开B窗体了
zhantianyou 2009-04-29
  • 打赏
  • 举报
回复
先Sublayout()
再Resumlay()大概這個吧.如果用線程的話,有問題吧.涉及到跨線程的問題.我這樣理解的,沒去做過.不過之前也是控件多,換的時候閃得歷害,我就是用這個方法做的

111,126

社区成员

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

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

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