Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/43: Рейтинг темы: голосов - 43, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 20.04.2010
Сообщений: 29
1

несколько таймеров в программе?

26.05.2010, 15:16. Показов 8262. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Люди добрые, подскажите пожалуйста!
В данный момент в моей программе (кстати, на Windows Mobile) крутятся 5 таймеров. У некоторых из них одинаковый интервал. Сначала все таймеры были System.Windows.Forms.Timer, но программа не всегда работала корректно. Я предположила, что возможно, какой то из таймеров срабатывает и не дает сработать другому таймеру. (то есть если события должны произойти одновременно, то произойдет только одно из них). На всякий случай заменила таймеры на System.Threading.Timer (в данном случае, действия по таймеру выполняются в отдельном потоке), но проблема осталась.
Возможно ли на самом деле такое, что проблемы возникают из-за одновременности срабатывания таймеров?

И еще - есть ли смысл использовать System.Threading.Timer если операции, выполняемые по таймеру, не занимают много времени? (например, считывается заряд аккумулятора КПК), а то в данном случае, хотя действие и выносится в отдельный поток, время затрачивается на создание и на завершение этого потока каждый раз когда срабатывает таймер
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.05.2010, 15:16
Ответы с готовыми решениями:

Запуск нескольких таймеров в потоке
Всем Привет! подскажите как сделать запуск несколько таймеров в потоке? я пытался каждый новый...

Массив таймеров и 1 обработчик события Tick
Подскажите, пожалуйста, как грамотнее сделать. Есть массив, в который я добавляю...

Массив таймеров
Здравствуйте. Подскажите пожалуйста с таким вопросом... В программе создается массив таймеров....

Несколько таймеров
Добрый вечер. Имеется 2 numericUpDown, 2 label, 2 кнопки. Мне нужно, чтобы по нажатию кнопки...

12
6048 / 3457 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
26.05.2010, 17:19 2
Цитата Сообщение от Question Посмотреть сообщение
У некоторых из них одинаковый интервал.
Если интервал одинаковый, зачем разносить действия в разные потоки, если можно выполнить в одном?

Цитата Сообщение от Question Посмотреть сообщение
но программа не всегда работала корректно
Что значит некорректно?

Цитата Сообщение от Question Посмотреть сообщение
какой то из таймеров срабатывает и не дает сработать другому таймеру. (то есть если события должны произойти одновременно, то произойдет только одно из них).
Такого быть не может. Прото события выполнятся последовательно (с какой-то изерной задержкой).

Цитата Сообщение от Question Посмотреть сообщение
должны произойти одновременно
Этого вы врядли добьетесь. Хотя тут все зависит от того, какой промежуток времени у Вас входит в понятие "одновременно".

Цитата Сообщение от Question Посмотреть сообщение
есть ли смысл использовать System.Threading.Timer
System.Windows.Forms.Timer также для себя создает отдельный поток, так что не вижу смысла.
0
1 / 1 / 0
Регистрация: 20.04.2010
Сообщений: 29
26.05.2010, 21:49  [ТС] 3
Цитата Сообщение от nio Посмотреть сообщение
Если интервал одинаковый, зачем разносить действия в разные потоки, если можно выполнить в одном?
Потому что заранее неизвестно, будут ли эти действия выполняться с одинаковым интервалом

Что значит некорректно?
ну если вкрадце - по одному таймеру данные1 считываются в буфер, по второму таймеру данные2 считываются в буфер, по третьему таймеру данные из буфера собираются, по четвертому пишутся в файл. Дак вот, возникает следующая ситуация - данные в файл пишутся, например каждую минуту, несколько минут все хорошо, а потом может вдруг некоторое время не писаться, а потом опять все нормально. Даже не знаю, где искать ошибку, то ли данные не приходят, то ли не пишутся, то ли что

Так конечно одними словами плохо наверно писать, какой то абстрактный вопрос получается, но код приводить тоже смысла нету, там много...

System.Windows.Forms.Timer также для себя создает отдельный поток
посмотрела в отладчике - ID потока такой же как и у главного, так что не создает
0
6048 / 3457 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
26.05.2010, 22:54 4
Прочитал в MSDN
Объект System.Threading.Timer — простой таймер, использующий методы ответного вызова, который обслуживается потоками пула. Не рекомендуется использовать с Windows Forms, поскольку обратные вызовы не происходят в потоках пользовательского интерфейса. System.Windows.Forms.Timer является более желательным вариантом для использования с Windows Forms. Для функций таймера, базирующихся на сервере, можно использовать System.Timers.Timer, который управляет событиями и обладает дополнительными функциями.
для контроля что все-таки происходит, пожалуй следует сделать некий лог, в котором каждое событие каждого таймера будет фиксироваться, тогда можно будет отследить, какой таймер когда и что делал.
0
464 / 341 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
27.05.2010, 03:24 5
System.Windows.Forms.Timer не создает нового потока. Смотрите в MSDN.
0
4337 / 1506 / 101
Регистрация: 12.04.2009
Сообщений: 2,342
27.05.2010, 05:01 6
Цитата Сообщение от nio Посмотреть сообщение
System.Windows.Forms.Timer также для себя создает отдельный поток
Вовсе нет.
0
1 / 1 / 0
Регистрация: 20.04.2010
Сообщений: 29
27.05.2010, 09:10  [ТС] 7
Цитата Сообщение от nio Посмотреть сообщение
для контроля что все-таки происходит, пожалуй следует сделать некий лог, в котором каждое событие каждого таймера будет фиксироваться, тогда можно будет отследить, какой таймер когда и что делал.
Пожалуй, так и сделаю...
0
6048 / 3457 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
27.05.2010, 09:12 8
body90, HIMen, согласен, че-то бес меня попутал, я сразу в MSDN и смотрел, только в раздел System.Threading.Timer. Но в любом случае несколько System.Windows.Forms.Timer не должны глушить друг друга.
0
464 / 341 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
27.05.2010, 14:35 9
Глушить они не должны друг друга. Теоретически, они вообще ставятся в очередь. Вот только интересно, как они влазят в естественный ход программы? Раз они не создают отдельный поток, значит в нужное время онные вписываются в поток в каком месте не происходило бы выполнение. Возможно, так же они влазят друг в друга. Хотя, весьма сомневаюсь в этом.
0
I ♥ C#
470 / 261 / 25
Регистрация: 07.05.2010
Сообщений: 567
27.05.2010, 21:15 10
Цитата Сообщение от body90 Посмотреть сообщение
Вот только интересно, как они влазят в естественный ход программы?
Провел небольшой эксперимент.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    public partial class Form1 : Form
    {
        int t = 0;
        public Form1()
        {
            InitializeComponent();
        }
 
        private void timer1_Tick(object sender, EventArgs e)
        {
            listBox1.Items.Add("timer" + t++);
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 20; i++)
            {
                listBox1.Items.Add(i);
                listBox1.Refresh();
                Thread.Sleep(500);
            }
        }
    }
Если бы таймер работал в отдельном потоке, то он бы вклинился в последовательность чисел, но при нажатии на кнопку числа от 0 до 19 идут непрерывно и лишь после 19 таймер продолжает отсчет с прерванной позиции. Выходит таймер ждет когда главный поток освободится и лишь затем продолжает работу.

Цитата Сообщение от Question
ну если вкрадце - по одному таймеру данные1 считываются в буфер, по второму таймеру данные2 считываются в буфер, по третьему таймеру данные из буфера собираются, по четвертому пишутся в файл. Дак вот, возникает следующая ситуация - данные в файл пишутся, например каждую минуту, несколько минут все хорошо, а потом может вдруг некоторое время не писаться, а потом опять все нормально.
Вы используете синхронизацию потоков? Может по каким-нибудь причинам таймер4 выполняется раньше таймера3, тогда ему нечего записывать в файл. Сделайте чтоб все таймеры, кроме своего обычного назначения, писали строки "таймер1", "таймер2" и т.д. в одно место, скажем в один файл, и посмотрите, не нарушается ли порядок их вызовов во время сбоя.
2
464 / 341 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
28.05.2010, 10:16 11
Вы только что доказывали, что таймер выполняется не в отдельном потоке и тут же говорите, что нужна синхронизация потоков... И как это 'главный поток освободится'?
0
I ♥ C#
470 / 261 / 25
Регистрация: 07.05.2010
Сообщений: 567
28.05.2010, 15:58 12
Ну, у автора-то сейчас таймеры System.Threading. А если нет, то может быть время на таймерах выставлено неправильно. Например, один таймер срабатывает каждые 60 секунд, а другой - каждые 61. Тогда через час логика программы нарушится. Но это все гадание на кофейной гуще, как тут можно с определенностью что-то сказать... А на счет "поток освободится" - я имел в виду, что он не будет иметь очереди команд на выполнение. В ходе еще нескольких экспериментов я выяснил, что таймер не может влезть ни между циклами, ни между функциями вызванными из другой функции, он будет ждать пока не произойдет выход из функции самого верхнего уровня - после завершения которой, управление не передается другой функции.
0
1 / 1 / 0
Регистрация: 20.04.2010
Сообщений: 29
28.05.2010, 16:23  [ТС] 13
Следственный анализ показал, что таймеры (System.Windows.Forms.Timer) работают правильно и никто из них никому не мешает. Проблема была действительно в том, что иногда данные удалялись раньше, чем происходила запись в файл, поэтому и получались такие "провалы". Буду думать как исправить ситуацию. Всем спасибо за ответы
0
28.05.2010, 16:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.05.2010, 16:23
Помогаю со студенческими работами здесь

Несколько файлов на вход программе
К примеру, в OpenFileDialog пользователь может зажав Ctrl выбрать несколько текстовых файлов и ...

Использование повторяющегося участка кода в программе несколько раз
В программе одинаковый учаток кода повторяется в нескольких местах. Скажите наиболее удобный...

Поочередное срабатывание таймеров
Есть три таймера, как заставить из сробатывать поочередно с заданным интервалом(задается через...

Timer, наложение таймеров один на другой
public partial class Form1 : Form { Timer tm = new Timer(); bool tick; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru