D
darnis
Unregistered / Unconfirmed
GUEST, unregistred user!
我应用是这样的:
本地应用通过SOCKET接收来自网络的信息,阻塞方式,单独的线程处理接收工作,
当收到的数据报要求与COM对象交互时,由线程中的代码驱动另一模块的相关操作,
本来在用户界面上可以正常进行的功能,但经过该线程去驱动执行时,却不能正常
工作(部分功能正常)。本人基础知识薄弱,实在分析不透是什么原因,只是初步
判定是线程环境与 要操作的COM对象生成时的环境之间有问题。不知如何解决。
想到由于线程产生的问题,估计与同步相关。修改线程中的代码,在收到操作请求时,
并不直接操纵COM对象。采用 PostMessage 的方式,通知数据处理模块。我为数据处理
模块添加了消息循环处理(参照的 TTimer 的实现),这样问题得以解决。但是另一个
问题又出现了:
死锁!
在数据处理模块中的消息处理过程如下:
procedure TlbCmdTransact.WndProc(var aMsg: TMessage);
begin
if aMsg.Msg = WM_PACKET then
try
Prepared;
except
//Application.HandleException(Self);
end
else
aMsg.Result := DefWindowProc(FHandle, aMsg.Msg, aMsg.wParam, aMsg.lParam);
end;
//////////////
// 数据处理模块初始化时
FHandle := AllocateHWnd(wndproc);
大部分时间会发生死锁,疑惑中………………
本地应用通过SOCKET接收来自网络的信息,阻塞方式,单独的线程处理接收工作,
当收到的数据报要求与COM对象交互时,由线程中的代码驱动另一模块的相关操作,
本来在用户界面上可以正常进行的功能,但经过该线程去驱动执行时,却不能正常
工作(部分功能正常)。本人基础知识薄弱,实在分析不透是什么原因,只是初步
判定是线程环境与 要操作的COM对象生成时的环境之间有问题。不知如何解决。
想到由于线程产生的问题,估计与同步相关。修改线程中的代码,在收到操作请求时,
并不直接操纵COM对象。采用 PostMessage 的方式,通知数据处理模块。我为数据处理
模块添加了消息循环处理(参照的 TTimer 的实现),这样问题得以解决。但是另一个
问题又出现了:
死锁!
在数据处理模块中的消息处理过程如下:
procedure TlbCmdTransact.WndProc(var aMsg: TMessage);
begin
if aMsg.Msg = WM_PACKET then
try
Prepared;
except
//Application.HandleException(Self);
end
else
aMsg.Result := DefWindowProc(FHandle, aMsg.Msg, aMsg.wParam, aMsg.lParam);
end;
//////////////
// 数据处理模块初始化时
FHandle := AllocateHWnd(wndproc);
大部分时间会发生死锁,疑惑中………………