Я сделал программу в Delphi для создания сервера и прослушивания ответа клиентов. Клиенты подключаются к серверу, отправляют некоторые данные и немедленно отключаются. Проблема в том, что иногда при получении данных моя программа перестает отвечать. И большую часть времени, когда я закрываю программу, я вижу EOSError 1400 [Invalid window handle.] (Я знаю, что эта ошибка связана с потоком носков). Я устанавливаю Active свойство TCPServer на false перед закрытием окна. Я тестировал как TTCPServer, так и TIdTCPServer, но проблема не решена.TCPServer and Error1400
Это мой код для TTCPServer:
procedure TMonitorFrm.TcpSerAccept(Sender: TObject;
ClientSocket: TCustomIpClient);
var
b: array [0..300] of Byte;
z, k: Byte;
s: String;
begin
repeat
z := ClientSocket.ReceiveBuf(b, SizeOf(b), 0);
s := '';
if (z > 6) then
begin
for k := 0 to z - 1 do
begin
s := s + IntToHex(b[k], 2);
if (k in [2, 5, 6]) then s := s + ' ';
end;
FullLst.Items.Add(s);
FullMessageEdt.Text := s;
if (Length(s) > 17) then Delete(s, 1, 17) else s := '';
k := MessagesGrd.RowCount;
MessagesGrd.RowCount := k + 1;
MessagesGrd.Cells[0, k] := Format('%d.%d.%d', [b[3], b[4], b[5]]);
MessagesGrd.Cells[1, k] := Format('%d.%d.%d:%d', [b[0], b[1], b[2], b[6]]);
MessagesGrd.Cells[2, k] := s;
MessagesGrd.Cells[3, k] := TimeToStr(Now);
MessagesGrd.Row := k;
end;
until (z = 0);
Application.ProcessMessages;
end;
И это мой код TIdTCPServer:
procedure TMonitorFrm.IdTCPSerExecute(AContext: TIdContext);
var
r: TIdBytes;
k: Byte;
s: String;
begin
AContext.Connection.IOHandler.ReadTimeout := TCPTimeOut;
AContext.Connection.IOHandler.ReadBytes(r, -1, False);
if (Length(r) > 6) then
begin
for k := 0 to High(r) do
begin
s := s + IntToHex(r[k], 2);
if (k in [2, 5, 6]) then s := s + ' ';
end;
FullLst.Items.Add(s);
FullMessageEdt.Text := s;
if (Length(s) > 17) then Delete(s, 1, 17) else s := '';
k := MessagesGrd.RowCount;
MessagesGrd.RowCount := k + 1;
MessagesGrd.Cells[0, k] := Format('%d.%d.%d', [b[3], b[4], b[5]]);
MessagesGrd.Cells[1, k] := Format('%d.%d.%d:%d', [b[0], b[1], b[2], b[6]]);
MessagesGrd.Cells[2, k] := s;
MessagesGrd.Cells[3, k] := TimeToStr(Now);
MessagesGrd.Row := k;
end;
Finalize(r);
Application.ProcessMessages;
end;
1. Посмотрите на [этой SO Входа о EOSError 1400 в многопоточном приложении, которое модифицирует графический пользовательский компонент] (http://stackoverflow.com/questions/6353903/possible-causes-of-eoserror- 1400-invalid-window-handle), для краткости: попробуйте синхронизировать изменения пользовательского интерфейса. В противном случае это (по крайней мере, для TTCPServer /) выглядит в значительной степени подобно примерам из embarcadero. 2. Для вашего кода TTCPServer ReceiveBuf может возвращать отрицательное значение в Socket Errors (или исключение, если оно настроено как таковое). В общем случае не оставляйте открытые диапазоны в условиях цикла/завершения. – makadev