Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Потоки и их закрытие в 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 чему равен ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо