Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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.032 c
1-1081055905
LiNkER
2004-04-04 09:18
2004.04.18
Помогите с RAVE Reports


3-1080047576
Aleksandr
2004-03-23 16:12
2004.04.18
Какой командой из триггера MS SQL можно запустить файл?


7-1076770080
MadGhost
2004-02-14 17:48
2004.04.18
Monitoring Communications Events


7-1076329781
WebErr
2004-02-09 15:29
2004.04.18
Как перегрузить соседний компьютер?


1-1080387964
KSergey
2004-03-27 14:46
2004.04.18
Как определить чего рисовать в OnPaint?





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