程序为DELPHI7写的,用了TTHREAD类,但是线程到了10就不再增加,请问各位是什么问题呢?
解决方案 »
- Odac插件是免费的不?
- DateTimePicker1控件的賦值問題,,姐姐哥哥們。幫幫哦
- [高分急求]关于程序在一台电脑上只运行一次的方法的疑问
- [求助]如何判断程序是在IDE环境中运行,还是通过exe文件运行?
- @@@@@@@@紧急求救!小妹遇到的急手问题~~~~~~~~~~~~~~~
- 软件快作完了,准备做共享。大家来评评,先发个demo
- 急!!!求windows系统资源的API
- 在delphi中如何打开POS机的钱箱?
- 请教:关于ActiveX
- 如何制作向网络蚂蚁那样的窗体
- socket对ip变化的具体处理方式是怎样的?
- 电脑装的WPS,用delphi 导出word文档,导出时软件卡死
不好意思,重新描述下:
DELPHI7的一个程序,用了TTHREAD+原生的TCPSERVER的,当线程数量达到10就不再连接,等待之前的某一个销毁后才连接
不好意思,重新描述下:
DELPHI7的一个程序,用了TTHREAD+原生的TCPSERVER的,当线程数量达到10就不再连接,等待之前的某一个销毁后才连接
windows非server版本的话,系统并发连接数是有限制的,默认是10,你可以搜索下工具,关键词“windows TCP/IP 并发连接数修改”
不好意思,重新描述下:
DELPHI7的一个程序,用了TTHREAD+原生的TCPSERVER的,当线程数量达到10就不再连接,等待之前的某一个销毁后才连接
windows非server版本的话,系统并发连接数是有限制的,默认是10,你可以搜索下工具,关键词“windows TCP/IP 并发连接数修改”
我的测试系统是WIN2003 SERVER
不好意思,重新描述下:
DELPHI7的一个程序,用了TTHREAD+原生的TCPSERVER的,当线程数量达到10就不再连接,等待之前的某一个销毁后才连接
windows非server版本的话,系统并发连接数是有限制的,默认是10,你可以搜索下工具,关键词“windows TCP/IP 并发连接数修改”
我的测试系统是WIN2003 SERVER
那这种情况,检查代码里有无限制吧。
procedure TForm1.FormCreate(Sender: TObject);
var
File_Path: array [0..MAX_PATH] of Char;
Cfg_String: array [0..MAX_PATH] of Char;
Cfg_FileName: string;
ComputerName: array[0..MAX_COMPUTERNAME_LENGTH+1] of char;
Size:Cardinal;
begin
ci:=0;
LB_MaxWidth:=0;
bLockUpdateTree:=FALSE; //当前路径
GetCurrentDirectory(MAX_PATH,File_Path);
Cur_Directory :=File_Path;
Cfg_FileName := File_Path + '\\config.ini';
MyLogFile := File_Path + '\\DServer.log';
// DeleteFile(MyLogFile);
//读取数据库连接配置
//1. 数据库地址
GetPrivateProfileString('DelphiDBServer','Database_Server','',Cfg_String,MAX_PATH,PCHAR(Cfg_FileName));
if Cfg_String='' then
begin
Cfg_String := '127.0.0.1';
WritePrivateProfileString('DelphiDBServer','Database_Server',Cfg_String,PCHAR(Cfg_FileName));
end;
DB_Server := Cfg_string; GetPrivateProfileString('DelphiDBServer','Database_Server_Port','',Cfg_String,MAX_PATH,PCHAR(Cfg_FileName));
if Cfg_String='' then
begin
Cfg_String := '1433';
WritePrivateProfileString('DelphiDBServer','Database_Server_Port',Cfg_String,PCHAR(Cfg_FileName));
end;
DB_Server_Port := Cfg_string; //2. 用户名
GetPrivateProfileString('DelphiDBServer','Database_Username','',Cfg_String,MAX_PATH,PCHAR(Cfg_FileName));
if Cfg_String='' then
begin
Cfg_String := 'username';
WritePrivateProfileString('DelphiDBServer','Database_Username',Cfg_String,PCHAR(Cfg_FileName));
end;
DB_Username := Cfg_string; //3. 密码
GetPrivateProfileString('DelphiDBServer','Database_Password','',Cfg_String,MAX_PATH,PCHAR(Cfg_FileName));
if Cfg_String='' then
begin
Cfg_String := 'password';
WritePrivateProfileString('DelphiDBServer','Database_Password',Cfg_String,PCHAR(Cfg_FileName));
end;
DB_Password := Cfg_string; //4. 数据库名称
GetPrivateProfileString('DelphiDBServer','Database_Name','',Cfg_String,MAX_PATH,PCHAR(Cfg_FileName));
if Cfg_String='' then
begin
Cfg_String := 'dbname';
WritePrivateProfileString('DelphiDBServer','Database_Name',Cfg_String,PCHAR(Cfg_FileName));
end;
DB_Name := Cfg_string; //5. 服务器程序 监听端口
GetPrivateProfileString('DelphiServer','Listening_Port','',Cfg_String,MAX_PATH,PCHAR(Cfg_FileName));
if Cfg_String='' then
begin
Cfg_String := '80';
WritePrivateProfileString('DelphiServer','Listening_Port',Cfg_String,PCHAR(Cfg_FileName));
end;
TCP_Listenning_Port := Cfg_string;
TcpServer1.LocalPort:= TCP_Listenning_Port;
GetPrivateProfileString('DelphiServer','TimeOut','',Cfg_String,MAX_PATH,PCHAR(Cfg_FileName));
if Cfg_String='' then
begin
Cfg_String := '0';
WritePrivateProfileString('DelphiServer','TimeOut',Cfg_String,PCHAR(Cfg_FileName));
end;
Beats_TimeOut := StrtoInt(Cfg_string); GetPrivateProfileString('DelphiServer','ReTime','',Cfg_String,MAX_PATH,PCHAR(Cfg_FileName));
if Cfg_String = '' then
begin
Cfg_String := '06:20:01';
WritePrivateProfileString('DelphiServer','ReTime',Cfg_String,PCHAR(Cfg_FileName));
end;
Fwzqdsj:=strtodatetime(Cfg_String);
//连接数据库
ADOConnection1.connectionstring:='Provider=SQLOLEDB.1;Data Source='+DB_Server+','+DB_Server_Port+';Persist Security Info=True;User ID='+DB_Username+';password='+DB_Password+';Initial Catalog='+DB_Name+';';
Size := MAX_COMPUTERNAME_LENGTH+1;
GetComputerName(ComputerName,Size);
MyComputerName:=StrPas(ComputerName); Timer1.Enabled:=True;
end;2、有连接接入
procedure MyClientHandleThreadFunc(ClientSocket: TCustomIpClient);
var
myThread:TMyClientHandleThread;
begin
myThread:=TMyClientHandleThread.Create(TRUE);
myThread.myClientSocket :=ClientSocket;
myThread.FreeOnTerminate :=TRUE;
myThread.Execute;
end;
3、处理
procedure TMyClientHandleThread.Execute;
var
RecvBUF:array[0..4096] OF Char ;
AdoQuery_1:TADOQuery;
AdoQuery_2:TADOQuery; idStr:string;
sbipStr:string;
jhStr:string;
str_YQ:string; retstr1,retstr2,retstr3:string;
cxsj :Tdatetime; LastTickCount:real; //系统tick
Timeout_time:Integer; //超时 ms
CurTime:TDATETIME; iKYE:currency;
iPrice:currency;
iXFnum:Integer;
xScreen,yScreen:integer;
begin
if not Assigned(myClientSocket) then
Exit;
if not myClientSocket.Active then
Exit;
iOnline:=0; //初始不在线 AdoQuery_1:=TADOQuery.Create(Form1);
AdoQuery_1.Connection:=Form1.ADOConnection1;
AdoQuery_2:=TADOQuery.Create(Form1);
AdoQuery_2.Connection:=Form1.ADOConnection1;
{ AdoQuery_3:=TADOQuery.Create(Form1);
AdoQuery_3.Connection:=Form1.ADOConnection1;
AdoQuery_4:=TADOQuery.Create(Form1);
AdoQuery_4.Connection:=Form1.ADOConnection1;
AdoQuery_5:=TADOQuery.Create(Form1);
AdoQuery_5.Connection:=Form1.ADOConnection1; } //判断address是否存在sbcx
if Form1.MyQueryOpen(AdoQuery_1,'select * from "sbcs" where sbip='''+myClientSocket.RemoteHost+''' and JSJM='''+Form1.MyComputerName+'''',true)=0 then
begin //不存在
strLog := '数据库中找不到'+myClientSocket.RemoteHost+'对应的设备记录,连接被拒绝。';
synchronize(AddLog);
AdoQuery_1.Close;
AdoQuery_2.Close;
myClientSocket.Close;
ci:=ci-1;
exit;
end
else
begin
strLog := '设备'+myClientSocket.RemoteHost+'已连接到服务器。['+myClientSocket.RemotePort+']'+inttostr(ci);
synchronize(AddLog);
//判断设备是否已在列表中
with AdoQuery_1 do
begin
First;
sbipStr:=FieldByName('sbip').AsString;
jhStr:=FieldByName('jh').AsString;
idStr:=FieldByName('id').AsString;
iOnline:=2;
Form1.UpdateDevInListView(idStr,IntToStr(iOnline),sbipStr,jhStr);
end;
end;
LastTickCount :=GetTickCount;
Timeout_time := Form1.Beats_TimeOut*1000;
ZeroMemory(@RecvBUF[0],SizeOf(RecvBUF));
if (Assigned(myClientSocket) and not (myClientSocket.Active) and not (myClientSocket.Connected)) then
begin
myClientSocket.Free;
exit;
end; while (Assigned(myClientSocket) and (myClientSocket.active) and (myClientSocket.Connected)) do
begin
if Timeout_time>0 then
begin
if GetTickCount-LastTickCount>Timeout_time then
begin
if(iOnline<>1) then
begin
if (iOnline>2) then
Form1.UpdateDevInListView(idStr,'1',sbipStr,jhStr);
iOnline:=1;
end;
break;
end; if myClientSocket.WaitForData(Timeout_time)=False then
begin
if(iOnline<>1) then
begin
if (iOnline>2) then
Form1.UpdateDevInListView(idStr,'1',sbipStr,jhStr);
iOnline:=1;
end;
break;
end;
end; ZeroMemory(@RecvBUF[0],SizeOf(RecvBUF)); //接收数据
if(myClientSocket.ReceiveBuf(RecvBUF,SizeOf(RecvBUF))<=0) then
continue; if RecvBUF[0]=#0 then
continue; //bufstr:=RecvBuF;
xScreen:=0;
yScreen:=0; //解析报文 retstr1:=GetValueFromPacket(RecvBUF,'CID');
if Assigned(myClientSocket) then
myClientSocket.Close;end;
end;
//添加到日志窗口
procedure TMyClientHandleThread.AddLog;
begin
Form1.AddLogInfo(strLog);
end;//接受新的client连接时
procedure TForm1.TcpServer1Accept(Sender: TObject;
ClientSocket: TCustomIpClient);
begin
MyClientHandleThreadFunc(ClientSocket);
end;
看到这句就知道你代码有问题了,TThread不是这么用的。
额。那应该怎么处理这个位置?
先理解TThread类,Execute不是由使用者调用的,你这么错误使用根本就不是多线程。