不好意思,重新描述下:
DELPHI7的一个程序,用了TTHREAD+原生的TCPSERVER的,当线程数量达到10就不再连接,等待之前的某一个销毁后才连接

解决方案 »


  1. 不好意思,重新描述下:
    DELPHI7的一个程序,用了TTHREAD+原生的TCPSERVER的,当线程数量达到10就不再连接,等待之前的某一个销毁后才连接
    windows非server版本的话,系统并发连接数是有限制的,默认是10,你可以搜索下工具,关键词“windows TCP/IP 并发连接数修改”
      


  2. 不好意思,重新描述下:
    DELPHI7的一个程序,用了TTHREAD+原生的TCPSERVER的,当线程数量达到10就不再连接,等待之前的某一个销毁后才连接
    windows非server版本的话,系统并发连接数是有限制的,默认是10,你可以搜索下工具,关键词“windows TCP/IP 并发连接数修改”
    我的测试系统是WIN2003 SERVER
      


  3. 不好意思,重新描述下:
    DELPHI7的一个程序,用了TTHREAD+原生的TCPSERVER的,当线程数量达到10就不再连接,等待之前的某一个销毁后才连接
    windows非server版本的话,系统并发连接数是有限制的,默认是10,你可以搜索下工具,关键词“windows TCP/IP 并发连接数修改”
    我的测试系统是WIN2003 SERVER

    那这种情况,检查代码里有无限制吧。
      

  4. 1、ONCREATE
    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;
      

  5. myThread.Execute;
    看到这句就知道你代码有问题了,TThread不是这么用的。
      


  6. 额。那应该怎么处理这个位置?

    先理解TThread类,Execute不是由使用者调用的,你这么错误使用根本就不是多线程。