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

这情况不是SS1引起的,是因为Join。

Thread.Join本意即为阻塞当前线程,等待子线程结束,在UI线程里调用Join方法,自然会出现界面暂时失去响应。这里为什么要调用Join呢?感觉不是很有必要。

同学。。你这里的写法其实根本没有用到多线程

原因很简单

你是定义了一个T的新线程,但是很可惜你在BeginDoSub这个独立的线程中又定义了一个deSomeSub的委托,并且直接用Me.Invoke把实际的执行任务提交给界面主线程运行了

所以你的图片的处理函数实际上是在主线程中运行的,新线程等于没用

正确的作法是,T定义为SomeSub这个函数为入口的线程,并启动它

在界面进度条更改的时候再使用Invoke来调用委托来进行界面更改。

自己再好好看看吧,时间问题我要走了。


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

原文地址: http://outofmemory.cn/yw/12068978.html

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

发表评论

登录后才能评论

评论列表(0条)

保存