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来调用委托来进行界面更改。
自己再好好看看吧,时间问题我要走了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)