Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.06 c
15-1339763619
Kerk
2012-06-15 16:33
2013.03.22
WebDAV в Windows XP


3-1284928524
sas-koval
2010-09-20 00:35
2013.03.22
SQLConnection. Как узнать пароль.


15-1343889055
БарЛог
2012-08-02 10:30
2013.03.22
Велопоход в никуда с палаткой на несколько дней


2-1343630882
vasa777
2012-07-30 10:48
2013.03.22
замена или переопределение процедуры


15-1350926092
Дмитрий С
2012-10-22 21:14
2013.03.22
Электрический натягиватель троссика?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский