请教Delphi 多线程切换输入法后程序假死了

请教Delphi 多线程切换输入法后程序假死了,第1张

function

TCFADODBStorage.OpenConnection:

Boolean

//线程里打开ADOConnection,在XP下切换输入法程序会死掉

//原因:ADO自动创建一个ADODB.AsyncEventMessenger窗口,然后会有一个对应的IME窗口,但线程里没有消息循环

//

XP下输入法切换时会SendMessage给IME窗口并等待返回,IME窗口并不会处理消息,造成死锁

//这个函数把线程里的IME窗口释放掉,切换输入法时就不会有消息过来了

procedure

_FreeIMEWindow

const

IME_WINDOW_CLASS

=

'IME'

IME_WINDOW_TEXT

=

'Default

IME'

var

h

:

HWND

pid

:

DWORD

dh

:

HWND

begin

h

:=

FindWindow(IME_WINDOW_CLASS,

IME_WINDOW_TEXT)

while

IsWindow(h)

do

begin

if

GetWindowThreadProcessId(h,

pid)

=

GetCurrentThreadId

then

dh

:=

h

else

dh

:=

0

h

:=

FindWindowEx(0,

h,

IME_WINDOW_CLASS,

IME_WINDOW_TEXT)

if

dh

<>

0

then

DestroyWindow(dh)

end

endbegin

try

FConnection.ConnectionString

:=

ConnectionString

FConnection.Connected

:=

True

if

GetCurrentThreadId

<>

Global.MainThreadID{全局的主线程ID,如果是主线程,不需要Free}

then

_FreeIMEWindow

except

on

E:

Exception

do

FLastErrorMessage

:=

e.Message

end

Result

:=

FConnection.Connectedend

[解决办法]

线程中要加入消息条件退出语句,这样才不能无限循环(假死)。

本文来自:读书人网(http://www.reader8.cn/)原文链接:http://www.reader8.cn/jiaocheng/20130711/2169937.html

这种情况有以下几点可能:

1.鼠标本身驱动有问题,导致切换后无法兼容运行,需要用驱动精灵检测修复一下。

2.电脑本身系统问题,界面切换存在系统多线程问题,无法正常切入,说明系统兼容性问题,可以考虑更换系统。

3,系统内存不足,也会导致无法正常加载硬件。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/11811934.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存