完成端口和ADO的问题,急急急急急!!!(300分)

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

一只没有缺点的狼

Unregistered / Unconfirmed
GUEST, unregistred user!
我写了一个服务器端程序,首先实现了winsock通讯的类,采用了IO完成端口的模式,并写了测试程序,效果很好,并发访问反应很快,然后实现数据库连接池的类的封装,测试没有问题,但是把两部分结合到一起的时候,发现当客户端连接的时候,服务器端在调用WSARecv读取客户端连接socket时,总出现SOCKET_ERROR错误,而且返回不是WSA_IO_PENDING错误,但是在数据库连接池里面不用ADO连接的时候,就不会有问题产生,谁能告诉我之间到底有什么冲突吗?
 
老大们,你们也把你们的可爱的小手伸一下,帮兄弟一把啊,现在也不是特别的冷,不用那么怕冻吧,我在线等待!
 
帮不上什么忙,帮您提前了
 
不太清楚你说的是什么? 如果方便发给我代码 我帮你看看。
 
代码不好完全发给你,但是我可以描述一下发生的情况,一个基于winsock的服务器,端口的模型采用完成端口模型,在负责数据传输的模块(现在就是封装到一个类里面),主要和
winsock的通信的方式采用PostQueuedCompletionStatus、GetQueuedCompletionStatus这两个函数。通讯的类维护着CPU×2个数量线程的线程池,负责数据的传输,另外一个数据库的类维护着CPU×2个数量线程的线程池,负责对收到的请求进行解析处理,此外还有一个主线程负责管理操作。分别基于这两个类的测试程序单独运行,都能正常操作,但是当结合这两个类的程序在一起运行的时候,就是有传输的类收到请求发送到数据库的类,然后发送处理结果的时候,发现完成端口操作经常出现错误,从而丢弃客户端,当把线程中TADOconnection连接中止掉的时候,就不会出现问题。好像ADO和完成端口操作之间有着某种冲突。如果有类似经历或经验的大侠,不吝赐教!谢谢!
 
怎么没有人关心啊,顶者有分!
 
我现在主要怀疑我的多线程的ADO访问有问题,我贴出代码,那位老大帮我看看:
TTestPool = class(TThread)
private
FConnectString:string;
AC:TADOConnection;
AQ:TADOQuery;
AP:TADOStoredProc;
{ Private declarations }
//初始化ADO数据库连接
function InitADO:boolean;
//释放ADO数据库连接
procedure FreeADO();
protected
procedure Execute; override;
public
constructor Create(CreateSuspended: Boolean;AConnectStr:string);
end;
implementation
{ TTestPool }

constructor TTestPool.Create(CreateSuspended: Boolean;
AConnectStr: string);
begin
FConnectString:=AConnectStr;
//CoInitializeEx(nil,COINIT_MULTITHREADED);
//CoInitialize(nil);
//InitADO();
inherited Create(CreateSuspended);
end;

procedure TTestPool.Execute;
begin
CoInitializeEx(nil,COINIT_MULTITHREADED);
InitADO();
try
while not Terminated do
begin
Sleep(1000);
end;
finally
FreeADO();
CoUninitialize();
end;
end;

procedure TTestPool.FreeADO;
begin
if AP <> nil then
begin
AP.Close;
AP.Free;
AP:=nil;
end;
if AQ <> nil then
begin
AQ.Close;
AQ.Free;
AQ:=nil;
end;
if AC <> nil then
begin
AC.Close;
AC.Free;
AC:=nil;
end;
end;

function TTestPool.InitADO: boolean;
begin
try
AC:=TADOConnection.Create(nil);
AQ:=TADOQuery.Create(nil);
AP:=TADOStoredProc.Create(nil);
AQ.Connection:=AC;
AP.Connection:=AC;
AC.ConnectionString:=FConnectString;
AC.Open();
Result:=True;
except
if AQ <> nil then
begin
AQ.Free;
end;
if AP <> nil then
begin
AP.Free;
end;
if AC <> nil then
begin
AC.Free;
end;
AC:=nil;
AQ:=nil;
AP:=nil;
Result:=False;
end;
end;
 
WSAGetLastError()返回值是多少?
另外function TTestPool.InitADO: boolean;
第一个语句要加CoInitialize(nil);即:
function TTestPool.InitADO: boolean;
begin
try
CoInitialize(nil);
...
 
首先,谢谢你。WSAGetLastError的返回值是10038,WSAENOTSOCK,‘Socket operation on nonsocket’,还有在CoInitialize在函数外不行吗,必须在一个函数内部吗?
 
老大们,见笑了,这个问题我已经解决了。不是ADO和完成端口之间的冲突问题。是我的线程之间的同步没有做的太好,造成完成端口队列中的overlapped遭到破坏,从而导致套接字错误。但是我的服务端程序中的现在线程很多,大概共计11个线程,当进程中的线程互相切换时,是不是对性能影响很大,我的服务器要求客户端连接大概在1000+以上的,现在连接的压力测试已经通过,但是把数据模块放在一起是不是很好?如果谁好的经验和建议,欢迎大家指导!
 
to 一只没有缺点的狼:
能否让兄弟看看你是如何做那个服务器端程序的吗,兄弟最近也要做一个,一筹莫展呀,请给我发个邮件讲讲,ok?(tangrh@21cn.com)
 
我也写了一个,不过是使控件实现的,cpu占用很高,又没有好办法降低一下阿!
 
我也这么用过,没有什么问题。
 
谢谢,张老大的关心,那个确实是这样没有什么问题,只是我控制线程同步的时候考虑不周造成的,哈哈。我可以提供socket服务器端代码,给大家一个参考,已经把服务器端封装成一个类了,谁要的话可以留个信箱。不过我写的注释比较少啊,讨论的话可以继续跟贴!
 
我想要一个,谢谢
yanghai0437@hotmail.com
 
给我一个,谢谢!
gzhubin@163.com
 
三个信箱,已经发走,查收。。。
 
一只没有缺点的狼:
老兄,给偶一个吧,呵呵,偶正需要呢。
goofree@163.com
请老兄顺便到下面来拿分,谢谢!
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2381483
 
我也想要一份,谢谢!
zhaoxibin@126.com
 
我也想要一份,谢谢!
zyt_1980@yahoo.com.cn
多交流
 
后退
顶部