请教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

var MyAccess: TAccessApplication//要加入access FileName: WideString//************************ var ADOConnection:TADOConnection//这个语句一定要加入adoconnection控件 ,或者要加入uses adodbADOQuery:TADOQuerytemppath:string//存放临时目录 tb:boolean//检查文件是否存在 begin try //首先判断是否有这个数据库 tb:= fileexists(edit1.Text )if tb then exit//如果数据库存在就退出 MyAccess := TAccessApplication.Create(Self)// myaccess.CloseCurrentDatabase //close database engin FileName := edit1.Text //如果路径不存在,程序不会自动创建 MyAccess.NewCurrentDatabase(FileName)myaccess.CloseCurrentDatabaseMyAccess.DisconnectMyAccess.Free//以上建库完毕 ,下面开始创建表和字段


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

原文地址:https://54852.com/yw/11548596.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存