Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Вопросы по потокам   Найти похожие ветки 

 
ixen   (2012-02-15 13:38) [0]

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


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

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


 
Anatoly Podgoretsky ©   (2012-02-15 13:57) [2]

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

Например FreeOnTerminate


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

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

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


 
Anatoly Podgoretsky ©   (2012-02-15 14:55) [4]

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

А зачем TThreadList?


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

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

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

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


 
ixen   (2012-02-15 15:25) [6]

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


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

> ixen   (15.02.12 15:25) [6]

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

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

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


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

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

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:49) [9]

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

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


 
ixen   (2012-02-15 15:58) [10]

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


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

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

// Даем команду на завершение всех вторичных потоков
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) [12]


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

Поток.Terminate


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


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

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



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.259 c
2-1334691033
Новичок
2012-04-17 23:30
2013.03.22
Сканер штрих-кодов


15-1350030766
AV
2012-10-12 12:32
2013.03.22
Вот как бы Вы поняли письмо


15-1334228111
Unknown user
2012-04-12 14:55
2013.03.22
Файл-контейнер с сигнатурой pstorage


15-1338429114
Думкин
2012-05-31 05:51
2013.03.22
Жизнь


15-1329391977
поверфулл
2012-02-16 15:32
2013.03.22
JavaScript и я