如何在线程中显示一个form?
我有个程序,在程序启动后后台有好几个线程同时运行,当检测到程序在传输数据时想在右下脚弹出个form来替代messagebox,像msn那样的消息提示.
但是我发现在线程中不好弄,有没哪位大哥帮我下,谢谢了。
调试环境:
vista utimate + vs2005(team,sp1).
------解决方案--------------------看一下BackGroundWorker控件的使用,起的线程不能直接调有UI线程.
用这个控件可以让线程通知UI线程去显示一个窗体.
------解决方案--------------------帮你顶!
------解决方案-------------------- 你这个弹出的窗体里是不是调用了别的东西?
或者还是结构写的有点问题,UI线程被阻了..
------解决方案--------------------关键在这里:
生成Form必须在UI的主线程中,如果不是的话,必须用Invoke或BeginInvoke去同步到那个线程上.
------解决方案--------------------在线程中用invoke方法调用委托来显示窗口!Form.BeginInvoke(delegate...)
------解决方案--------------------用BackGroundWorker就可以不用BEGININVOKE了.
可能还是结构之间有些问题...
------解决方案--------------------用Invoke或BeginInvoke
http://msdn2.microsoft.com/zh-tw/library/0b1bf3y3(VS.80).aspx
------解决方案--------------------if (InvokeRequired)
{
BeginInvoke(new ReplyCompletedDelegate(PerformReply), new object[] { result });
}
------解决方案--------------------在用Invoke或BeginInvoke去同步到主线程上的时候,重要的是要找到一个在主线程上生成的Form或 Control, 然后用它的Invoke或BeginInvoke:
private delegate void OpenFormDelegate();
//在后台数据线程中调用此function.
//假设myControl 是一个主线程中生成的Control 或 Form
private void OpenForm()
{
if (myControl.InvokeRequired)
myControl.Invoke(new OpenFormDelegate(DoOpenFormJob));
else
DoOpenFormJob();
}
private void DoOpenFormJob()
{
try
{
//弹出一个Form
}
catch (ThreadAbortException Err)
{
}
}
------解决方案--------------------有分就接!
------解决方案--------------------采用委托或事件的方式
我觉得用事件的方式是最好的,通知主线程,然后在事件代码中写出显示FORM的代码