Форум: "Сети";
Текущий архив: 2010.11.07;
Скачать: [xml.tar.bz2];
ВнизПотоки и их закрытие в TServerSocket Найти похожие ветки
← →
FBuilder (2008-12-08 18:13) [0]Не могу понять, как корректно закрывать потоки?
procedure CloseThread(ID: integer);
begin
sct := TTCPIPServerClientThread(
TcpServerLocal.Socket.GetClientThread(TServerClientWinSocket(TcpServerLocal.Sock et.Connections[ID])));
if Assigned(sct) then
begin
sct.Terminate;
sct.DoTerminate;
TcpServerLocal.Socket.Connections[ID].Close;
....
end;
end;
Оно или оставляет поток и переводит его в Idle или виснет, (как напримре на Close) так как ждет критической секции, которая занята, так как поток ждет инфомрацию по сокету..
?
← →
Сергей М. © (2008-12-08 19:06) [1]TcpServerLocal.ServerType чему равен ?
← →
FBuilder (2008-12-08 19:53) [2]stThreadBlocking
← →
Сергей М. © (2008-12-08 19:58) [3]Достаточно закрыть соединение, обслуживаемое потоком.
Грамотно реализованный поток обязан отслеживать состояние своего соединения и немедленно завершать его обслуживание по факту закрытия или критического отказа этого соединения.
← →
FBuilder (2008-12-08 20:04) [4]Как именно?
При
TcpServerLocal.Socket.Connections[ID].Close;
На потоке, который ждет данных оно вешается, так как:
procedure TCustomWinSocket.Close;
begin
Disconnect(FSocket);
end;
а
procedure TCustomWinSocket.Disconnect(Socket: TSocket);
begin
Lock; // <- вот тут и висит, так ка кждет данных...
try
← →
Сергей М. © (2008-12-08 20:15) [5]Кто ждет-то ?
И за каким лешим этот самы "кто-то" захватил крит.секцию и не отпускает ее ?
← →
FBuilder (2008-12-08 20:18) [6]Есть поток
он ждет новых данных из сокета:
while (ClientSocket.ReceiveLength <> 0) or (S = "") do
begin
ClientSocket.ReceiveBuf(Buf^, BUFSIZE);
S := S + string(Buf);
FillChar(Buf^, BUFSIZE, #0);
end;
А тут нам свяше в главном потоке приложения пришло то, что нам нужно этот поток остановить!
Мы пытаемся ызвать
Close;
но напарываемся на критическую скцию, в которую мы попали когда
вызываем
ClientSocket.ReceiveBuf(Buf^, BUFSIZE);
или
ClientSocket.ReceiveLength
(см. имплементацию)
как обойти и завершить все таки этот поток?
← →
Сергей М. © (2008-12-08 20:34) [7]
> or (S = "")
А это зачем ?
Убирай нафиг, ибо бред.
while not Terminated and ClientSocket.Connected do
try
BytesToRead := ClientSocket.ReceiveLength;
if BytesToRead = 0 then Continue;
ActualBytesRead := ClientSocket.ReceiveBuf(Buf^, Min(ActualBytesRead, BUFSIZE));
if ActualBytesRead = 0 then Break;
except
Exit;
end;
← →
Сергей М. © (2008-12-08 20:39) [8]
> FBuilder
Вызывай Receive-метод только тогда, когда ReceiveLength > 0.
И никаких других условий !
← →
FBuilder (2008-12-11 07:07) [9]Спасибо!
Изменение кода в эту сторону кажется помогло жить :)
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2010.11.07;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.003 c