IdTCPServer控件造成界面死掉 ( 积分: 100 )

  • 主题发起人 主题发起人 wlandll
  • 开始时间 开始时间
W

wlandll

Unregistered / Unconfirmed
GUEST, unregistred user!
IdTCPServer控件造成界面死掉。
早先一个Server端一Client端时是IdTCPClient端界面死掉,后在客户端加上IdAntiFreeze控件解决了此问题,当时服务器端是好的。
之后是两个客户端一个服务器端,结果服务器端偶尔会死掉,
现在是三个客户端一个服务器端,结果服务器频繁死掉。
看样子是同步访问并发造成的。
不知道该如何解决。
 
IdTCPServer控件造成界面死掉。
早先一个Server端一Client端时是IdTCPClient端界面死掉,后在客户端加上IdAntiFreeze控件解决了此问题,当时服务器端是好的。
之后是两个客户端一个服务器端,结果服务器端偶尔会死掉,
现在是三个客户端一个服务器端,结果服务器频繁死掉。
看样子是同步访问并发造成的。
不知道该如何解决。
 
application.ProcessMessages
或者用
interface
uses Windows;
type
TCriticalSection = class(TObject)
private
FSection: TRTLCriticalSection;
public
constructor Create;
destructor Destroy;
override;
procedure Enter;
procedure Leave;
end;

implementation
{ TCriticalSection }
constructor TCriticalSection.Create;
begin
inherited Create;
InitializeCriticalSection(FSection);
end;

destructor TCriticalSection.Destroy;
begin
DeleteCriticalSection(FSection);
inherited Destroy;
end;

procedure TCriticalSection.Enter;
begin
EnterCriticalSection(FSection);
end;

procedure TCriticalSection.Leave;
begin
LeaveCriticalSection(FSection);
end;
 
这样可以吗?当服务器程序死掉时,客户端就连接不上了,必须手工杀掉服务器进程,重新启动服务器程序才能继续使用。
 
服务器端加线程管理控件,IdThreadMgrDefault或IdThreadMgrPool
 
IdTCPServerExecute 我在这个事件中写了操作数据库的代码,会不会是两个线程同时写数据库,所以程序死掉呢?
 
lxw5214:
能告诉我IdThreadMgrDefault这个控件怎么用吗?
是不是在要线程保护的代码前加 GetThread;
在要线程保护的代码后加 RealseThread;?
还有什么需要注意的吗?望告知!
 
控件本身应该没有很大毛病,我做的实时服务系统,使用了500个客户端都不存在问题,现在已经连续运行了3个多月了。要是出现了问题,应该是编程方面的问题,或者在适当的时候应该把控制权移交个系统。
 
要是有数据库操作方面的活动的话,那应该在操作数据库的时候,要检测资源申请失败的信息,再次申请或者释放,这应该是数据库方面的控件问题,不是IdServer的问题,应该转移调测对象。
 
jamcky:是我说法上的问题,这几个控件本身应该都没有问题,应该是我没有使用好多线程,没有进行线程保护的问题。这样,当一个线程在写一张表的同时另一个线程也来写这张表,这就有可能会造成数据库中该表的死锁。
不知道你有没有使用线程保护,是如何保护的?
 
你自己创建线程了吗?如果是的话,可能你自己创建的线程有问题。
IdTcpServer自己就是用了线程管理器,不需要你再自己设置。
 
这方面应该从数据库方面入手解决问题,你可以在线程里加上表锁检测控制嵌套。
另外,你也可以通过独立的过程(或函数)来控制数据库的保存过程。
当实在没办法的是后,你可以使用状态机的方式来控制数据保存。
 
还要注意一点,多线程不能使用同一个数据库连接。
如果使用ADO,不要忘了在执行线程函数中的存取指令之前执行CoInitialize(nil),并确保在线程函数的最后执行CoUninitialize。
 
后退
顶部