Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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
6-1229185383
ASMiD
2008-12-13 19:23
2010.11.07
компонент для чтения с FTP сервера для Delphi7


2-1281512818
brother
2010-08-11 11:46
2010.11.07
Помогите с регуляркой


6-1228749191
FBuilder
2008-12-08 18:13
2010.11.07
Потоки и их закрытие в TServerSocket


2-1281938546
mefodiy
2010-08-16 10:02
2010.11.07
Сравнение "runtime" и "design time"


15-1280158011
AKE
2010-07-26 19:26
2010.11.07
Скажите это развод??





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский