Форум: "Система";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];
ВнизThread Найти похожие ветки
← →
Alibaba © (2004-02-19 00:27) [0]Такая ситуация:
Есть ОЧЕРЕДЬ ЗАДАЧ - последовательность задач для выполнения (QueueTask: TList)
Есть СПИСОК ПОТОКОВ - список одновременно работающих потоков (Thread) также организован в виде ListThread: TList
Количество задач в ОЧЕРЕДИ ЗАДАЧ - не ограничено.
Может быть сколько угодно.
Количество потоков в СПИСКЕ ПОТОКОВ ограничено.
Например - 5.
Схема простая.
1.Задачи становятся в очередь.
2.Из очереди берем задачу, запускаем в потоке.
3.Повторяем п.2 до тех пор пока есть свободные потоки.
4.Если свободных потоков нет - ждем пока какой-нибудь из потоков освободится (решит свою задачу).
5.Освободился поток - выполняем п.2
Данную схему работы можно организовать в двух вариантах.
Вариант №1:
Есть задача в очереди -
- создаем поток
- решаем задачу
- освобождаем поток
Вариант №2:
Есть задача в очереди -
- создаем поток
- решаем задачу
- НЕ освобождаем поток (в следующий раз, когда необходимо будет этому потоку решать другую задачу - вызовем Resume)
Чем отличается Вариант №1 от Варианта №2?
В первом случае мы создаем поток, работает, освобождаем.
При этом если нет задач в очереди - нет потоков в памяти.
Но если появляется задача - необходимо тратить время для
Thread.Create
Во втором случае мы создаем поток, работаем, и оставляем
поток в памяти.
Если нет задач - есть потоки в памяти.
Если появляется задача - не надо создавать поток - он уже есть.
Необходимо просто передать ему параметры и вызвать Resume.
Прокоментируйте, какой вариант лучше.
← →
Suntechnic © (2004-02-19 07:30) [1]Чего здесь комментировать? Я надеюсь ты понимаешь, что велосипед не изобрёл. То, что описано у тебя во втором варианте, называется использованием пула потоков. Начиная с Win 2000 для этих целей у Windows даже специальная ф-ция имеется
QueueUserWorkItem
.
И тот и другой подход имеет право на существование. Какой из них более приемлем зависит от условий. Лично я поступал так: если время выполнения задачи было сопоставимо со временем создания потока, то такая задача решалась у меня через пул потоков. Если нет, создавался отдельный поток. Но это был мой конкретный случай, где я мог оценить время задачи.
← →
Alibaba © (2004-02-19 12:09) [2]Время выполнения задачи колеблется в широком диапазоне 5 мин - 12 часов.
Поэтому я использую Вариант №2.
Единственное, что хотелось бы, - гибко управлять количеством одновременно запущенных потоков.
В зависимости от различных условий у меня получается одновременно запускать 5-8 потоков.
Почему - не знаю :(
← →
Александр Спелицин © (2004-02-19 18:10) [3]Почитайте это:
Рихтер. Программирование серверных приложений для Windows 2000.
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.031 c