Форум: "Начинающим";
Текущий архив: 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.081 c