多线程的莫名奇妙的问题(200分)

  • 主题发起人 主题发起人 一只没有缺点的狼
  • 开始时间 开始时间

一只没有缺点的狼

Unregistered / Unconfirmed
GUEST, unregistred user!
我最近用了TSocketConnection+TClientDataSet在线程中做了个后台查询,应用服务器用
的线程模式APARTMENT,SocketConnection和ClientDataSet全是在线程中动态创建的,把
查询结果用PostMessage的方法发送到主线程,所以在线程除了错误处理之外的地方没有用
Synchronize方法,用了两个临界区和主线程实现同步,访问数据库一只很正常,没有任何
错误,其他操作也很正常,但是测试人员在程序中切换输入法后,程序就没有反应了,这时
CPU的占用率也很低,后来发现在SocketConnection创建的过程中把SupportCallbacks属性
设为False,程序一直运行到现在都很正常,我想知道为什么?恳请大家指教
 
确实莫名其妙:)
调试一下,切换输入法后到底发生了什么问题。
是否和测试的环境有关,多换几种测试环境.
 
To xeen:
我们的测试环境很全的,win98、win200、winxp都有,每次都一个程序测试的时候都是一个
很干净的系统!测试环境应该没有问题!
 
请高手指定一下啊,我不想这个问题就这么不明不白的过去
 
你在线程中用了其他控件吗?特别是Twincontrol类的,如果是这样的化,有可能出现问题的。
 
To Headchen:
我在线程里没有用Twincontrol类的控件,我在线程里用了一个任务管理的对象,它是我从
TComponent继承下来的,我AllocateHWnd为它分配了一个Handle,用来和线程通讯,难道
问题出现在这里吗?
 
大哥我也想用TSocketConnection+TClientDataSet 作线程查询!一直搞不出来!麻烦给我例子!
小弟不胜感激!!求求你了!为此我快要郁闷死了 email:nbzxx@cnnb.net;
 
To chinanbzxx:
我已发走!
 
一只没有缺点的狼:
问题就出在这里,在线程中,请不要用AllocateHWnd,最后不要用Tcomponent(用了也不一定出问题)
自己用原生的api生成窗口,得到hwnd,我想会解决问题的。
另外若你生成hwnd是为了和线程进行通信,我看完全就没有必要的,直接在线程中作消息循环就可以,
通信可以用PostThreadmessage,不就得了?
 
To Headchen:
我在线程中没有创建组件,也没有分配句柄,所有创建组件分配句柄的工作全在主线程里
完成,源代码如下:
constructor TClientManager.Create(CreateSuspended: Boolean;
LinkHandle: HWND;
Owner: TDataServer);
begin
FreeOnTerminate:=False;
FLinkHandle:=LinkHandle;
FOwner:=Owner;
ExecLevel:=1;
CurTask:=nil;
FFailLinkCount:=0;
FLastTaskID:=0;
inherited Create(CreateSuspended);
end;
其中Owner就是我在主线程创建的用于任务管理的组件,然后把它作为一个参数传给线程。
这样写会影响线程的消息循环吗?我对于COM的线程类型和消息循环的关系理解的不好,
希望你能不吝赐教!
 
算了吧,我就当这样结束了吧!谢谢各位大侠捧场
 
多人接受答案了。
 
后退
顶部