Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Завершение потока и TThreadList


Автор: _Rin 25.6.2007, 09:23
Пишу TCP сервер и клиент(на Indy).
На сервере создаю поток для обработки сообщений от клиента. Поток работает с ThreadList-ом (делает LockList и UnlockList).
Как правильно уничтожить поток, чтобы быть уверенным, что поток сделает ThreadList.UnlockList, до того как сам "умрет". 

Execute потока (CommandList: TThreadList)
Код

procedure TDataProcessing.Execute;
var
 Command: TCommand;
 Connection: TConnection;
begin

 while not Terminated do
 begin

     try

       Command:=nil;
       Connection:=nil;
       with CommandList.LockList do
       try
          if Count>0 then
          begin
             Command:=TCommand(Items[0]);
             Remove(Command);
          end;
       finally
          CommandList.UnlockList;
       end;


       if Command<>nil then
       begin

          Connection:=Command.Connection;
          if (WaitForSingleObject(Connection.hMutex, INFINITE)<>WAIT_TIMEOUT) then
          begin

           with Connection.Buffer do
             ....//тут обработка

           ReleaseMutex(Connection.hMutex);
           Command.Free;
          end;
       end;

     except
        on E: Exception do
        begin
          RichEditText:=E.Message;
          Synchronize(ServerForm.PrintToMainRichEdit);
        end;
     end;

 end;//while not Terminated
 
end;


Автор: MetalFan 25.6.2007, 12:38
Цитата(_Rin @  25.6.2007,  10:23 Найти цитируемый пост)
if (WaitForSingleObject(Connection.hMutex, INFINITE)<>WAIT_TIMEOUT) then

простите, но LOL

p.s. а в чем собственно вопрос?
поток "умрет" тогда, когда ему выставят terminated...  память освободиться в случае, если FreeOnTerimate = true

Автор: _Rin 25.6.2007, 12:59
хм...а подробнее....что не так?

Добавлено через 1 минуту и 38 секунд
Проблема в том, что CommandList после "уничтожения" потока не разлочивается....

Добавлено через 6 минут и 6 секунд
Потоку выставляется terminated, FreeOnTerimate стоит в true, этот поток завершается, но из основного потока программы не получается обратиться к CommandList.   smile 

Автор: MetalFan 25.6.2007, 22:28
Цитата(_Rin @  25.6.2007,  10:23 Найти цитируемый пост)
 with CommandList.LockList do
       try
          if Count>0 then
          begin
             Command:=TCommand(Items[0]);
             Remove(Command);
          end;
       finally
          CommandList.UnlockList;
       end;

а что если Remove(Command) заменить на Delete(0) ?

Автор: _Rin 28.6.2007, 12:39
Возник такой вопрос....
Есть 2 потока, работают с одним ThreadList-ом.
1) Первый поток сделал LockList и начал работать с элементами списка
2) Одновременно с этим второй поток делает ThreadList.Add (без  LockList)
3) Что произойдет со списком в первом потоке (он увидит новый добавленный элемент, или нет)...???

Аналогично, что будет, если второй поток сделает ThreadList.Remove (без  LockList) ???  

Автор: MetalFan 28.6.2007, 12:58
_Rin, посмотри в classes реализацию этих методов и все сам поймешь.

hint: методы
    procedure Add(Item: Pointer);
    procedure Clear;
    procedure Remove(Item: Pointer);
внутри себя вызывают Lock/Unlock List

Автор: _Rin 29.6.2007, 08:54
Спасибо...теперь вроде разобралась  smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)