日期:2014-05-19  浏览次数:20730 次

如何在线程中显示一个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的代码