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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.053 c
14-1080407900
DillerXX
2004-03-27 20:18
2004.04.18
Кот


1-1080806011
Domkrat
2004-04-01 11:53
2004.04.18
Ищу Control


3-1080017883
DimaF
2004-03-23 07:58
2004.04.18
Неточный поиск IB


1-1080885974
V-Isa
2004-04-02 10:06
2004.04.18
Изменить свойство "чужого" компонента.


4-1076174980
nester
2004-02-07 20:29
2004.04.18
Как внедриться в OutlookExpress.