Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Завершение потока и TThreadList 
:(
    Опции темы
_Rin
Дата 25.6.2007, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 12.9.2006

Репутация: нет
Всего: нет



Пишу 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;


PM MAIL   Вверх
MetalFan
Дата 25.6.2007, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 14
Всего: 128



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

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

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

Это сообщение отредактировал(а) MetalFan - 25.6.2007, 12:41


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
_Rin
Дата 25.6.2007, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 12.9.2006

Репутация: нет
Всего: нет



хм...а подробнее....что не так?

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

Добавлено через 6 минут и 6 секунд
Потоку выставляется terminated, FreeOnTerimate стоит в true, этот поток завершается, но из основного потока программы не получается обратиться к CommandList.   smile 
PM MAIL   Вверх
MetalFan
Дата 25.6.2007, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 14
Всего: 128



Цитата(_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) ?


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
_Rin
  Дата 28.6.2007, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 12.9.2006

Репутация: нет
Всего: нет



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

Аналогично, что будет, если второй поток сделает ThreadList.Remove (без  LockList) ???  
PM MAIL   Вверх
MetalFan
Дата 28.6.2007, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 14
Всего: 128



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

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


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
_Rin
Дата 29.6.2007, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 12.9.2006

Репутация: нет
Всего: нет



Спасибо...теперь вроде разобралась  smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0704 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.