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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> System.Timers.Timer проблема 
V
    Опции темы
Xonxt
Дата 20.5.2008, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 24.1.2006
Где: Украина / Одесса

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



Доброе время суток. 

Возникла такая проблема. Чтобы долго не объяснять, скажу просто, что у меня есть некий класс, в который я добавляю таймер. Использовать Windows.Forms.Timer не получается, т.к. он почему-то тупо не работает. Поэтому я использую System.Timers.Timer. 

Идея в том, что таймер запускается в момент создания экземпляра класса. Мне требуется в любой момент времени получить время "существования" объекта в милимекундах. Выглядит это так:

Код

public class DetectedObject
{  
    private System.Timers.Timer timer;
    private double totalTime;
   
    public DetectedObject()
    {
        Initialize();   
    } 
   
    private void Initialize()
    {
        timer = new System.Timers.Timer(1);    // 1 милисекунда 
        timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Tick);
        timer.Start();
    }
   
    private void timer_Tick(object sender, System.Timers.ElapsedEventArgs e)          
    {
        totalTime = totalTime + timer.Interval;      
    }  
}


Затем в какой-то лыбой момент времени я считываб переменную totalTime.

Проблема в том, что, согласно моим наблюдениям, таймер срабатывает каждый 10 милисекунд, вместо 1. 
Так, через секунду работы программы я получаю на выходе значение 100 вместо 1000. Что я делаю не так?
PM MAIL ICQ Skype   Вверх
mihryak
Дата 20.5.2008, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



а таймер-то зачем? =)
запомни время создания - и вычитай её из текущего времени
Код

    public class DetectedObject
    {
        private readonly DateTime dateCreated = DateTime.Now;

        public TimeSpan Lifetime
        {
            get { return DateTime.Now - dateCreated; }
        }
    }


Добавлено через 1 минуту и 10 секунд
а таймер не работает, т.к. максимальное разрешение доступных таймеров - 10мс
PM MAIL ICQ   Вверх
source777
Дата 20.5.2008, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

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



Цитата(Xonxt @  20.5.2008,  16:07 Найти цитируемый пост)
Что я делаю не так? 
всё. да к тому же ты не учитываешь, что Windows оперирует квантами времени по 1/64 секунды. Поэтому использовать таймеры Windows для измерения времени можно только, если это время кратно 125 мс.

Добавлено через 3 минуты и 11 секунд
Цитата(Xonxt @  20.5.2008,  16:07 Найти цитируемый пост)
Использовать Windows.Forms.Timer не получается, т.к. он почему-то тупо не работает. 
Кстати, если ты тупо не можешь корректно создать, проинициализировать и запустить Windows.Forms.Timer, это ещё не повод обвинять таймер, ибо он прекрасно работает даже без форм, так что ищи причину в себе...



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
mihryak
Дата 20.5.2008, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



source777, откуда столько злости? дружелюбнее стоит быть
У Windows.Forms.Timer есть существенные ограничения по использованию, о чём MS честно говорит в MSDN

Цитата(MSDN)
This Windows timer is designed for a single-threaded environment where UI threads are used to perform processing. It requires that the user code have a UI message pump available and always operate from the same thread, or marshal the call onto another thread.

Цитата(MSDN)
The Windows Forms Timer component is single-threaded, and is limited to an accuracy of 55 milliseconds. If you require a multi-threaded timer with greater accuracy, use the Timer class in the System.Timers namespace.


PM MAIL ICQ   Вверх
Xonxt
Дата 21.5.2008, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 24.1.2006
Где: Украина / Одесса

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



Цитата(mihryak @ 20.5.2008,  17:09)
а таймер-то зачем? =)
запомни время создания - и вычитай её из текущего времени
Код

    public class DetectedObject
    {
        private readonly DateTime dateCreated = DateTime.Now;

        public TimeSpan Lifetime
        {
            get { return DateTime.Now - dateCreated; }
        }
    }

Большое спасибо.  smile  Я так и хотел сделать, но не знал, что тип DateTime можно друг из друга вычитать smile И что при этом поучается TimeSpan... Век живи - век учись....  smile 

PM MAIL ICQ Skype   Вверх
2vad
Дата 1.10.2008, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Использовать Windows.Forms.Timer не получается, т.к. он почему-то тупо не работает.


Даже после
Код

private void Form1_Load(object sender, EventArgs e)
        {
            timer1.Start();
        }


не работает?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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