![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| Bladerender |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 19.7.2007 Репутация: нет Всего: нет |
Итак задача (переделанная из специфической в объекты, понятные всем).
Назовём её так. "Многопоточный сбор состояния экипажа танка" Есть у нас конвеер, на котором движутся танки. В танках уже сидит экипаж (роботы). У этих роботов есть коллекция модулей, у которых в парарельных потоках нужно опросить их состояние. Т.е. грубо говоря у модуля есть метод Ready(), который вернет пригодность или нет. Танк -> роботы -> Начинка роботов. При чем опрос танков на конвеере и опрос роботов в танке проходит не паралельно а один за другим, а именно опрос модулей робота в танке - многопоточно. В каждом роботе может быть разное количество модулей. В среднем 8-15. Опрос каждого модуля ~ 200мс. И не хотелось бы использовать что-то типа Тред.Слип(). Хочу архитектурку чисто event based... Вроде все вводные предоставил. Преступим. В идеологии должно бы было это работать. БекграундВоркер запускает в фоновом потоке метод ПроверитьВсеТанки(). ПроверитьВсеТанки() перебирает танки по одному и вызывает их проверку (через публичный метод класа Танк). Метод ПроверитьТанк() берет первого члена своего экипажа и запускает метод проверки модулей ПроверитьРобота(). ПроверитьРобота перебирает все модули, запуская для проверки каждого модуля свой тред. Каждый тред вернет результат в обработчик ивента и как только общее количество результатов совпадет с количеством модулей - вызовется метод ПроверитьТанк() с следующим членом экипажа. Итак. Есть метод ПроверитьВсеТанки() который привязан к BackGroundWorker. Весь процесс начинается с backgroundworker.RunWorkerAsync();
Сам проверяльщик модулей описывать бумаю не стоит, что бы не загромождать. Обычный класс, который замаячит обработчику событий ПроверяльщикМодулей_Checked о том, что переданный модуль проверен. После этого проверяльщик умирает, так как для каждого модуля создается свой экземпляр проверяльщика. Где у меня бок? Бок в том, что метод ПроверитьРобота() отправляет на проверку модули и заканчивается, что приводит к тому, что он возвращает проверяльщику танка, что я выполнился и можно отправлять на проверку следующий танк. Как справится - не очень понимаю. Сразу напрашивается - сделать ивент у Танка, что бы он срабатывал в том месте, где у меня return; ()типа там где кончился экипаж. Только вот проблемы это как бы не снимает, так как метод ПроверитьВсеТанки() всеравно побырику отправит все танки на проверку и бекграундВоркер схлопнется Это сообщение отредактировал(а) Bladerender - 31.5.2011, 15:56 |
|||
|
||||
| vlsaf |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 423 Регистрация: 9.5.2007 Репутация: нет Всего: 1 |
На вскидку.
Ты же должен дождаться выполнения потоков. А для этого поток, котрый запускает другие потоки должен ждать, а не идти дальше, не дождавшись выполнения. Кури Join() |
|||
|
||||
| gambit |
|
|||
![]() Эксперт ![]() ![]() ![]() Награды: 1 Профиль Группа: Комодератор Сообщений: 1359 Регистрация: 25.6.2006 Где: я? Репутация: 3 Всего: 40 |
||||
|
||||
| Bladerender |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 19.7.2007 Репутация: нет Всего: нет |
Join() решает. Спасибо.
|
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | .NET для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |