Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка списка в заданное время. Обработка элементов списка в опр. время 
:(
    Опции темы
SmartBye
Дата 14.9.2010, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 15.5.2008

Репутация: нет
Всего: нет



Проблема довольно абстрактная, вот только не знаю, как лучшее ее решить.
Есть некоторый список (не List, а абстрактный список)
Каждый элемент которого нужно обработать в определенное время, закрепленное за этим элементом.
Долго думал, как решить этот вопрос, надумалось только два решения, но, на мой взгляд они не очень совета:
1. Я пишу некоторый класс-менеджер, в котором хранится этот список (отсортированный по времени). Затем каждую секунду опрашиваю его из какого-то внешнего возбудителя (скажем, это будет Timer в WinForms) на предмет не пришло ли время первого события, т.е. то, которое имеет ближайшее время. Если пришло, то менеджер передает обработку этого элемента обработчику и выкидывает из списка (или ставит в конец) и таким же образом ожидаю времени следующего события.
Тут мне видятся такие проблемы:
  • Менеджер зависим от внешних факторов, например, таких как таймер, который будет его опрашивать, т.е. привязка к винформам
  • Ежесекундный (а скорее вего чаще, что бы не пропустить времени события) опрос менеджера постоянно будет терзать процессор (хоть и не много, но, по идее, будет), что не есть очень хорошо. Хотя не уверен существенна ли эта нагрузка.
2. Вынести обработку в отдельный поток, в котором список отсортируется по времени по возрастанию и между элементами списка будет просто исползоваться Thread.Sleep(интервал до обработки следующего списка), что бы дождаться времени следующего элемента.
  • С потоками я еще не работал, поэтому не знаю, хорош ли этот способ (если честно, то он мне пришел в голову, когда я вводил название темы).
  • Не нравится, что постоянно будет висеть в фоне спящий поток, но, опять же, я с потоками не работал, поэтому не знаю, хорошо это или плохо.

Задача вроде бы тривиальная, но вот выбрать приемлемый способ ее реализации не могу.
PM MAIL   Вверх
nmn
Дата 14.9.2010, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 593
Регистрация: 26.11.2005

Репутация: 1
Всего: 1



Цитата(SmartBye @  14.9.2010,  18:40 Найти цитируемый пост)
*

2. Вынести обработку в отдельный поток, в котором список отсортируется по времени по возрастанию и между элементами списка будет просто исползоваться Thread.Sleep(интервал до обработки следующего списка), что бы дождаться времени следующего элемента.

    * С потоками я еще не работал, поэтому не знаю, хорош ли этот способ (если честно, то он мне пришел в голову, когда я вводил название темы).
    * Не нравится, что постоянно будет висеть в фоне спящий поток, но, опять же, я с потоками не работал, поэтому не знаю, хорошо это или плохо.

ну как вариант, ничего плохого в принципе нет, синхронизацию только нужно правильно сделать

еще как вариант использовать Timer (хоть из Threading, хоть из WinForms), и после каждой обработки менять значение интервала, так чтобы в нужное время этот таймер сработал для следующего элемента
PM Skype   Вверх
SmartBye
Дата 15.9.2010, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 15.5.2008

Репутация: нет
Всего: нет



Т.е. второй способ будет наиболее оптимальный? Или лучше использовать таймер из потоков?
PM MAIL   Вверх
nmn
Дата 15.9.2010, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 593
Регистрация: 26.11.2005

Репутация: 1
Всего: 1



тут зависит от специфики задачи,  в частности как часто необходимо обрабатывать, как долго будет происходить обработка, что происходит во время обработки

если использовать Timer из WinForms, то тут нет проблем с синхронизацией (событие выполняется в том же потоке что и форма), но если обработка будет занимать много времени, то UI приложения будет подвисать

использование собственного потока и Threading.Timer примерно одинкаово, но если время на обработку одного элемента превысит время ожидания до обработки следующего потока, то Timer cоздаст новый поток, а при использовании собственного потока будет запаздывание (как поезд, если будет стоять на одной станции слишком долго то на следующую он прибудет с опазданием), так что если обработка элемента операция независимая то предпочтительнее использовать таймер, если зависит от обработки предыдущих элементов, то собственный поток
и конечно нельзя забывать о синхронизации при доступе к разделяемым ресурсам
PM Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0989 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.