MFC程序一切换输入法就卡死,该怎么解决
MFC程序一切换输入法就卡死
最近编写了一个MFC的SDI程序,使用了多线程、SOCKET、OLEDB等技术,程序运行时只要切换输入法,程序就卡死,不管是用快捷键还是用鼠标选择的方法切换都试过,结果都一样;查看任务管理器CPU占用也是0%,其他程序运行正常,不知是什么原因。
在网上找了好久的资料,有一个好象有点相关:OS在切换输入法时会向线程发一个消息,而自己创建的子线程是没有消息循环的,重载了Run方法等,线程没有窗口,OS发消息给线程就会卡在这里;但为什么OS不发给主窗口消息呢,而且其他多线程程序都没有这个问题,所以怀疑是不是socket有问题,MFC的socket架构好象后台会启动一个线程,但用一个单纯的socket程序测试后不会出现这种情况。
现在不知哪位大侠帮忙指点一下迷津,本人十分感谢
------解决方案--------------------
你用的什么输入法?换个输入法试试。另外能否在程序里设个断点试试。
------解决方案--------------------
以前遇到过,没详细研究过,反正是没有消息循环的线程不要直接使用CSocket和ADO之类的东西,
它们会创建一个隐藏的窗口,附带会创建一个标题为Default IME的窗口(用来接收输入法消息的)
输入法切换时,应该是处于Focus的窗口对应的线程(一般是主线程)发出消息到程序里所有Default IME窗口,通知输入法已改变,如果该消息没处理,会造成SendMessage塞死,会卡死SendMessage的线程(一般是主线程)。
貌似win7改用了SendMessageTimeout,不会再造成卡死
解决方法是,把主线程以外的Default IME窗口都DestroyWindow掉
或者用SendMessage到主界面,让主线程创建,通过SendMessage把其指针传递过来
最近编写了一个MFC的SDI程序,使用了多线程、SOCKET、OLEDB等技术,程序运行时只要切换输入法,程序就卡死,不管是用快捷键还是用鼠标选择的方法切换都试过,结果都一样;查看任务管理器CPU占用也是0%,其他程序运行正常,不知是什么原因。
在网上找了好久的资料,有一个好象有点相关:OS在切换输入法时会向线程发一个消息,而自己创建的子线程是没有消息循环的,重载了Run方法等,线程没有窗口,OS发消息给线程就会卡在这里;但为什么OS不发给主窗口消息呢,而且其他多线程程序都没有这个问题,所以怀疑是不是socket有问题,MFC的socket架构好象后台会启动一个线程,但用一个单纯的socket程序测试后不会出现这种情况。
现在不知哪位大侠帮忙指点一下迷津,本人十分感谢
输入法
socket
多线程
程序卡死
------解决方案--------------------
你用的什么输入法?换个输入法试试。另外能否在程序里设个断点试试。
------解决方案--------------------
以前遇到过,没详细研究过,反正是没有消息循环的线程不要直接使用CSocket和ADO之类的东西,
它们会创建一个隐藏的窗口,附带会创建一个标题为Default IME的窗口(用来接收输入法消息的)
输入法切换时,应该是处于Focus的窗口对应的线程(一般是主线程)发出消息到程序里所有Default IME窗口,通知输入法已改变,如果该消息没处理,会造成SendMessage塞死,会卡死SendMessage的线程(一般是主线程)。
貌似win7改用了SendMessageTimeout,不会再造成卡死
解决方法是,把主线程以外的Default IME窗口都DestroyWindow掉
或者用SendMessage到主界面,让主线程创建,通过SendMessage把其指针传递过来