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

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

Вопросы по потокам [D7, XP]


ixen ©   (2012-02-15 13:38:00) 

Здравствуйте! Пишу программу, которая по IP адресу опрашивает некое устройство, получая от них инфу. С этим проблем нет. Необходимо реализовать все это в потоке, причем сколько IP адресов столько и потоков. Заранее сколько будет устройств не известно, соответствественно потоков тоже. Каким образом можно организовать создание и уничтожение потоков? Если поток один, то мы его описываем как T:TMyThread; а если их несколько нужно создвать динамический массив T: array of TMyThread; Есть ли другие способы?


Поток   (2012-02-15 16:05:00) [1]


> ixen   (15.02.12 15:58) [10]
> а как из главного потока обращаться к уже работающему потоку
> что бы его остановить?

Пройти по списку, найти в нем нужный поток и вызвать его метод Terminate.


Поток   (2012-02-15 16:02:00) [2]

И завершение программы из главного потока:

// Даем команду на завершение всех вторичных потоков
with ThreadList, LockList do
try
 for i := 0 to Count - 1 do
   TMyThread(Items[i]).Terminate;
finally
 UnlockList;
end;
// Ждем завершения всех вторичных потоков
while ThreadList.LockList.Count > 0 do
begin
 ThreadList.UnlockList;
 SwitchToThread;
end;


Германн   (2012-02-15 16:02:00) [3]


> ixen   (15.02.12 15:58) [10]
>
> а как из главного потока обращаться к уже работающему потоку
> что бы его остановить?

Поток.Terminate


ixen   (2012-02-15 15:58:00) [4]

а как из главного потока обращаться к уже работающему потоку что бы его остановить?


Поток   (2012-02-15 15:49:00) [5]

Даже еще проще (глянул в справку):

procedure TMyThread.Execute;
begin
 FreeOnTerminate := True;
 ThreadList.Add(Self);
 try
   while not Terminated do
   begin
     // Здесь один цикл работы с устройством
   end;
 finally
   ThreadList.Remove(Self);
 end;
end;


Поток   (2012-02-15 15:43:00) [6]

Вернее, примерно так:

procedure TMyThread.Execute;
begin
 FreeOnTerminate := True;
 with ThreadList, LockList do
 try
   Add(Self);
 finally
   UnlockList;
 end;
 try
   while not Terminated do
   begin
     // Здесь один цикл работы с устройством
   end;
 finally
   with ThreadList, LockList do
   try
     Remove(Self);
   finally
     UnlockList;
   end;
 end;
end;


Поток   (2012-02-15 15:36:00) [7]

> ixen   (15.02.12 15:25) [6]

TThreadList - это просто готовый потокобезопасный список. Удобен для задач подобного рода.

> Поток будет ... по сути бесконечный... пока пользователь сам его
> не остановит..

Сам по себе юзер остановить вторичный поток не может, потому что юзер работает с главным потоком. Остановить вторичный поток может либо работающее с ним устройство (отключившись), либо главный поток (по команде юзера). И в том, и в другом случае надо вызвать у потока Terminate. Тогда получаем очень простой Execute:
while not Treminated do
begin
 // Здесь один цикл работы с устройством
end;


ixen   (2012-02-15 15:25:00) [8]

Спасибо, про TThreadList не знал.. буду делать через него..
Поток будет с указанной периодичностью опрашивать устройство, т.е. по сути он бесконечный... пока пользователь сам его не остановит..


Поток   (2012-02-15 15:24:00) [9]

> Anatoly Podgoretsky ©   (15.02.12 14:55) [4]

Зависит от задачи. Вообще говоря, не обязательно, но может быть полезно, если нужно, чтобы главный поток мог управлять другими потоками.

Например, если работу с устройством нельзя прерывать где попало, то при завершении программы главный поток может пройти по списку и вызвать у каждого вторичного потока Terminate. При этом каждый вторичный поток корректно отцепляется от своего устройства и завершается, а главный поток дожидается завершения всех вторичных потоков и тоже завершается.


Anatoly Podgoretsky   (2012-02-15 14:55:00) [10]

> Поток  (15.02.2012 14:08:03)  [3]

А зачем TThreadList?


Поток   (2012-02-15 14:08:00) [11]

По событию подключения устройства поток порождается, сам себя заносит в глобальный список TThreadList и работает с устройством самостоятельно.

По событию отключения устройства (и при завершении программы) у потока вызывается Terminate. Перед завершением поток исключает из списка сам себя, а потом самоуничтожается через FreeOnTerminate.


Anatoly Podgoretsky   (2012-02-15 13:57:00) [12]

> ixen  (15.02.2012 13:38:00)  [0]

Например FreeOnTerminate


Сергей М.   (2012-02-15 13:46:00) [13]

Т.е. если бы это был не TMyThread, а а любой иной класс, то вопросов бы у тебя не возникло, так ?


Наверх

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