![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| CynicRus |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 248 Регистрация: 31.5.2012 Репутация: нет Всего: 5 |
Приветствую уважаемых форумчан.
Имеется класс, создающий треды. И Класс треда, который обрабатывает в несколько экземпляров глобальную очередь, перекидывая полученное и обработанное из очереди в другую очередь. Затем необходимо, чтобы по завершению обработки первой очереди пулом тредов - запускался второй пул тредов, который обработает уже вторую очередь. Но, задача - дабы второй пул тредов запускался только после того как отработал первый. И вот как организовать метод execute потоков пула, чтобы дождаться завершения его работы - у меня чего-то ум за разум зашёл. Код потока:
Потоки то работают, но....работают постоянно, тоесть даже когда он ничего не делает по идее, он всё равно прогоняет execute. Код пула:
PS: метод с получением количества занятых потоков не сработал. Собственно вопрос - как это организовать правильно? |
||||
|
|||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
Мне кажется надо "более правильно" распределить задачи.
Пусть "рулением" выдаваемых потокам задач занимается отдельный поток-менеджер. А в рабочем потоке добавить объект ядра (я, как правило, использую EVENT), для управления состоянием/определения состояния. Т.е. алгоритм примерно такой: 1. Поток-менеджер (ПМ) следит за очередью задач на исполнение... появилась задача 2. ПМ проверяет пул потоков, берет первый "свободный" рабочий поток (РП) (у которого, к примеру, не "взеден" EVENT). 3. ПМ извлекает задачу из очередни на исполнение и назначает ее выбранному в п.2 РП. Событие "занятости" у РП взводится (SetEvent). 4. В execute РП в цикле проверяется состояние события (WaitForSingle/MultipleObject[s] /TEvent.WaitFor), если событие взведено - выполняет задачу, по окончанию "сбрасывает" состояние события. 5. ПМ проверяет состояние пула потоков, если какой-то из них "закончил" работу над задачей, "извлекает" ее из потока и помещает в очередь отработанных задач. Сигнализирует, при необходимости "наружу" о новой завершенной задаче. Естественно, все действия с разделяемыми данными должны быть потокобезопасны. Никаких небезопасных присвоений флагов (FBusy) внутри одного потока - проверки флагов другим и т.п. Как-то так обычно у меня логика построена Это сообщение отредактировал(а) MetalFan - 2.9.2013, 11:39 -------------------- There are always someone smarter than you... |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |