Есть простейший сервер чата. Работает на блокирующих сокетах.
При подключении к нему хотя бы одного клиента он жрет 30-40% прцессорного времени (даже в режиме ожидания), при подключении второго, третьего ... проценты почти не увеличиваются. Подскажите это так и должно быть или не правильно построен серевер. Основные процедуры ниже
Кстати, клиент тоже потребляет около 15%.
Могу выложить полный исходник.
Код:
procedure TFormChatServer.ServerSocketGetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket; var SocketThread: TServerClientThread);
begin
SocketThread := TSCThread.Create(true, ClientSocket);
SocketThread.Priority := tpLower;
SocketThread.Resume;
MemoDebug.Lines.Add('Создал поток для клиента - '+ClientSocket.RemoteAddress);
end;
procedure TSCThread.ClientExecute;
var
Zagolovok : TZagolovok;
i : integer;
begin
try
while (not Terminated) and (ClientSocket.Connected) do
try
if ClientSocket.ReceiveLength>0 then
begin
ClientSocket.ReceiveBuf(Zagolovok, SizeOf(Zagolovok));
if Zagolovok.ID=$2AA2 then
begin
case Zagolovok.Comm of
1: PrLogin;
50: PrMsg;
end;
end;
end;
except
FormChatServer.MemoDebug.Lines.Add('Отсоеденился с ошибкой - '+ClientInfo.Login);
ClientSocket.Close;
Break;
end;
finally
FormChatServer.MemoDebug.Lines.Add('Поток для клента убит - '+ClientInfo.Login);
for I := 0 to Clients.Count - 1 do
if TClientInfo(Clients.Items[i]^).Login=ClientInfo.Login then Break;
Clients.Delete(i);
FreeMem(ClientInfo);
Terminate;
end;
end;