![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Потоки и их закрытие в TServerSocket [D7]
FBuilder © (2008-12-08 18:13:00)Не могу понять, как корректно закрывать потоки?
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) так как ждет критической секции, которая занята, так как поток ждет инфомрацию по сокету..
?
FBuilder (2008-12-11 07:07:00) [1]Спасибо!
Изменение кода в эту сторону кажется помогло жить :)
Сергей М. (2008-12-08 20:39:00) [2]
> FBuilder
Вызывай Receive-метод только тогда, когда ReceiveLength > 0.
И никаких других условий !
Сергей М. (2008-12-08 20:34:00) [3]
> 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;
FBuilder (2008-12-08 20:18:00) [4]Есть поток
он ждет новых данных из сокета:
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:15:00) [5]Ктождет-то ?
И за каким лешим этот самы "кто-то" захватил крит.секцию и не отпускает ее ?
FBuilder (2008-12-08 20:04:00) [6]Как именно?
При
TcpServerLocal.Socket.Connections[ID].Close;
На потоке, который ждет данных оно вешается, так как:
procedure TCustomWinSocket.Close;
begin
Disconnect(FSocket);
end;
а
procedure TCustomWinSocket.Disconnect(Socket: TSocket);
begin
Lock; // <- вот тут и висит, так ка кждет данных...
try
Сергей М. (2008-12-08 19:58:00) [7]Достаточно закрыть соединение, обслуживаемое потоком.
Грамотно реализованный поток обязан отслеживать состояние своего соединения и немедленно завершать его обслуживание по факту закрытия или критического отказа этого соединения.
FBuilder (2008-12-08 19:53:00) [8]stThreadBlocking
Сергей М. (2008-12-08 19:06:00) [9]TcpServerLocal.ServerType чему равен ?