Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.11.07;
Скачать: CL | DM;

Вниз

Потоки и их закрытие в 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.01 c
15-1280079752
turbouser
2010-07-25 21:42
2010.11.07
А вот


2-1281770096
Artemka86
2010-08-14 11:14
2010.11.07
Вывод информации в StringGrid


15-1280344780
Kolan
2010-07-28 23:19
2010.11.07
Как проверить алгоритм


2-1281959405
Slay64
2010-08-16 15:50
2010.11.07
Этикеточный принтер


2-1281683349
12
2010-08-13 11:09
2010.11.07
что-то с message происходит, не знаю как и спросить