![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
DragonFire |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 14.8.2005 Где: Москва Репутация: 1 Всего: 9 |
Задача такая - есть N объектов, у каждого из них есть встроенный таймер. Таймер может сработать в произвольное (заранее не известное) время.
При срабатывании таймера у какого-либо объекта необходимо выполнить длинный ресурсоемкий код. Но если все делать в лоб, пока код выполняется, срабатывают (или могут сработать) другие таймеры и логика программы будет нарушена. Мне необходимо "ставить на паузу" все остальные таймеры, при срабатывании одного, а после выполнения кода обработчика, возобновлять работу. Как такое реализовать? |
|||
|
||||
Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 11 Всего: 24 |
Создай класс, который в отдельном потоке будет управлять всеми остальными потоками.
|
|||
|
||||
Heinzz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 381 Регистрация: 12.12.2008 Где: .net Репутация: 5 Всего: 9 |
я бы сделал иначе. Создайте очередь в которую будут попадать ваши объекты при срабатывании таймера. Обрабатывайте ее последовательно. Что-то останавливать/запускать - лишние затраты ресурсов если много объектов.
|
|||
|
||||
Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 11 Всего: 24 |
может быть. лично я всегда против n потоков. чаще всего этого не требуется. но что бы судить о чем то нужно знать суть задачи. например, было бы не плохо уточнить по какому принципу срабатывают таймеры. и может быть их можно переделать в какой то алгоритм, который бы высчитывал какой кусок кода запускать и когда. и попробовать реализовать все это в одном потоке. тогда вопрос остановки остальных таймеров отпал бы сам собой. |
|||
|
||||
DragonFire |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 14.8.2005 Где: Москва Репутация: 1 Всего: 9 |
Очередь не подойдет, так как моделируется псевдореальное время.
Задача такая: есть СМО (система массового обслуживания). В случайные моменты времени в систему приходят клиенты (поток поступления клиентов, со непредсказуемым временем срабатывания), которые обрабатываются мастерами (еще N потоков, у каждого свое непредсказуемое время срабатывания). Проблема в том, что при срабатывании какого-либо события выполняется код, которые отнимает некое время. Из-за этого клиент, который должен был придти через 4 еденицы времени, приходит через 5 едениц (т.к. когда он пришел, выполнялся некий посторонний код). Из-за таких накладок получается мешанина событий несвязанный нормально. Нуобходимо перед выполнением любого сложного кода блокировать все остальные таймеры, чтобы не смешивать "время из предметной области, за которое отвечают таймеры" и "симтемное время, которое тратится на выполнение кода". |
|||
|
||||
Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 11 Всего: 24 |
как я уже говорил:
т.е. этот класс должен знать все об остальных потоках, и когда срабатывает таймер одного из потока он(класс) должен заблокировать все остальные, кроме того который сработал. потом этот класс должен дождаться завершения выполнения кода, и снова запустить все потоки. но это несколько не понятно. ведь по сути клиент может прийти в любое время, и во время выполнения твоего кода, как тогда быть? |
|||
|
||||
DragonFire |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 14.8.2005 Где: Москва Репутация: 1 Всего: 9 |
В том то и дело, что поток прихода клиента должен быть просто заморожен на время выполнения кода
![]() |
|||
|
||||
kobra |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 730 Регистрация: 15.6.2005 Где: Грузия, Тбилиси Репутация: 1 Всего: 9 |
мне кажется что постановка задачи не коректна, или задача невыполнима.
если кажды клиент может воити в систему когда угодно (чтобы была емуляция реального времени), значит нелзя блокировать его. но если не блокировать, то произаидет мешанина событий. взаимо исклучающие условия |
|||
|
||||
Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 11 Всего: 24 |
DragonFire, ну тогда делай через класс, который будет управлять всем остальным. но как уже сказали, весьма странное условие. лучше все таки очередь(ИМХО).
|
|||
|
||||
DragonFire |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 14.8.2005 Где: Москва Репутация: 1 Всего: 9 |
Все оказалось просто:
Смысл в добавление Stopwatсh чтобы отследить время работы таймера.... Это сообщение отредактировал(а) DragonFire - 3.1.2010, 02:28 |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |