子线程无法创建窗体的问题
2009-06-24 15:44
148 查看
最近开发IM项目的时候,遇到一个问题:客户端收到消息的时候,要弹出对话款。
我是单开一个线程来监听服务器消息的,当收到消息的时候如果窗口没打开,则自动打开。
问题出现了,窗体打开后即死掉,反白。
首先想到的是可能代码写错了,于是检查几次,都未发现问题。于是想到可能是线程里创建窗体权限的问题。有在主窗体上拖个按钮,写上创建新窗体的代码,运行发现一切正常。
这时候就确定是线程的问题了。
主窗口用于主线程,用以接收各种系统消息。可能是我的子线程和系统交互的消息受阻。
这时候尝试在
Form frmObj = new Form ( );
frmObj. Show ( System. Windows. Forms. IWin32Window );
的Show()方法里面做文章。
查阅了一些网文,找到了一篇看似有帮助的帖子。代码是vb.net的,然后把它翻译成C#。代码如下:
实现了IWin32Window接收,
public class WindowWrapper : System. Windows. Forms. IWin32Window
{
private System. IntPtr _hwnd;
public WindowWrapper ( System. IntPtr handle )
{
_hwnd = handle;
}
public System. IntPtr Handle
{
get { return _hwnd; }
}
}
然后在封装系统的一个获取当前主窗体的API.
[System. Runtime. InteropServices. DllImport ( "user32")]
public static extern System. IntPtr GetForegroundWindow();
最后在我的线程方法里调用
System. IntPtr IntPart;
IntPart = GetForegroundWindow ( );
WindowWrapper OwinForm = new WindowWrapper ( IntPart );
frmChat frmObj = new frmChat ( cm );
frmObj. Show ( OwinForm );
本以为新创建的窗体已经依附于主窗体了,应该可以像正常窗体一下。
结果发现还是死掉。
思考中。。。既然是主线程才能创建的窗体对象,那我就用拥有主线程的主窗体来创建。哈哈。
当前窗体拥有主线程,所以一切就顺利起来了。
代码:
void GetActiveWindowMehtod ( )
{
//在拥有主窗体的线程上创建子窗体
this. Invoke ( new GetActiveWindowHandle ( GetActiveWindow ));
}
delegate void GetActiveWindowHandle ( );
void GetActiveWindow ( )
{
//在这里写创建新窗体的代码
frmChat fc = new frmChat ( );
fc. Show ( );
}
然后在子线程的方法了调用 GetActiveWindowMehtod();
运行窗体正常显示。
这么几句代码,每天都在写好多遍。遇到问题就不一定能像的起来。越是简单的问题越要仔细。
我是单开一个线程来监听服务器消息的,当收到消息的时候如果窗口没打开,则自动打开。
问题出现了,窗体打开后即死掉,反白。
首先想到的是可能代码写错了,于是检查几次,都未发现问题。于是想到可能是线程里创建窗体权限的问题。有在主窗体上拖个按钮,写上创建新窗体的代码,运行发现一切正常。
这时候就确定是线程的问题了。
主窗口用于主线程,用以接收各种系统消息。可能是我的子线程和系统交互的消息受阻。
这时候尝试在
Form frmObj = new Form ( );
frmObj. Show ( System. Windows. Forms. IWin32Window );
的Show()方法里面做文章。
查阅了一些网文,找到了一篇看似有帮助的帖子。代码是vb.net的,然后把它翻译成C#。代码如下:
实现了IWin32Window接收,
public class WindowWrapper : System. Windows. Forms. IWin32Window
{
private System. IntPtr _hwnd;
public WindowWrapper ( System. IntPtr handle )
{
_hwnd = handle;
}
public System. IntPtr Handle
{
get { return _hwnd; }
}
}
然后在封装系统的一个获取当前主窗体的API.
[System. Runtime. InteropServices. DllImport ( "user32")]
public static extern System. IntPtr GetForegroundWindow();
最后在我的线程方法里调用
System. IntPtr IntPart;
IntPart = GetForegroundWindow ( );
WindowWrapper OwinForm = new WindowWrapper ( IntPart );
frmChat frmObj = new frmChat ( cm );
frmObj. Show ( OwinForm );
本以为新创建的窗体已经依附于主窗体了,应该可以像正常窗体一下。
结果发现还是死掉。
思考中。。。既然是主线程才能创建的窗体对象,那我就用拥有主线程的主窗体来创建。哈哈。
当前窗体拥有主线程,所以一切就顺利起来了。
代码:
void GetActiveWindowMehtod ( )
{
//在拥有主窗体的线程上创建子窗体
this. Invoke ( new GetActiveWindowHandle ( GetActiveWindow ));
}
delegate void GetActiveWindowHandle ( );
void GetActiveWindow ( )
{
//在这里写创建新窗体的代码
frmChat fc = new frmChat ( );
fc. Show ( );
}
然后在子线程的方法了调用 GetActiveWindowMehtod();
运行窗体正常显示。
这么几句代码,每天都在写好多遍。遇到问题就不一定能像的起来。越是简单的问题越要仔细。
相关文章推荐
- C#窗口中创建了线程,关闭窗口,进程无法结束的问题
- 解决Windows 2008无法创建线程问题
- 编程日常:创建枚举窗体的线程, 结果无法找到目标窗体
- c#在新线程创建窗体卡住问题
- 异步线程无法多次创建的问题
- C# 启动线程后,关闭form窗体,进程未关闭问题
- Spring boot 使用注解方式无法新建一个后台线程问题
- linux环境下的线程的创建问题
- 关于Ado在DLL新建线程中,无法将_ConnectionPtr指针实例化的问题!
- Java 中的多线程-两种创建方式,定时器的应用,线程的安全问题可以用银行转账来说明
- 关于无法加载已创建的布局文件的问题的解决方案以及已布局在对应的R文件中未生成相应ID的问题的解决
- windows安装程序无法创建新的系统分区,也无法定位现有系统分区:问题解决.md
- Teamcenter开发问题之-- relation 无法创建 and 无法check in
- main入口方法中创建线程执行顺序的问题
- 解决MMC无法创建管理单元的问题!
- 解决通过createElement创建出来的radio无法选中的问题
- [备忘]解决ManualResetEvent.WaitOne在Silverlight环境下将整个UI线程卡死,并无法继续调用异步子线程的问题
- VS2005 无法创建或打开“智能设备”项目的一个问题的解决方法
- 解决主窗体拖拽移动过程中DoModal出来的窗体无法收到鼠标消息问题
- 解决idea用maven创建java项目代码无法编译的问题