![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопросы по потокам [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, а а любой иной класс, то вопросов бы у тебя не возникло, так ?