Проблема с обработчиком событий таймера - Vc ++ - PullRequest
1 голос
/ 10 ноября 2011

Я запустил новую форму Windows в Visual Studio 2010, используя язык C ++. Существует только один таймер, настроенный для генерации события каждые 1 мс (1 миллисекунда)

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

Принимая во внимание, что событие таймера происходит каждые 1 мс, в течение каждой 1 секунды переменная Counter должна увеличиваться в 1000 раз, но переменная Counter занимает около 15 секунд, чтобы увеличиваться в 1000 раз. Через 15 секунд значение, отображаемое в текстовом поле, равно 1000.

Я установил событие таймера на 1 мс, но кажется, что событие происходит только каждые 15 мс, потому что переменной Counter потребовалось в 15 раз (15 секунд) больше, чем теоретически, чтобы достичь значения 1000 (1 секунда = 1000 * 1 мс) ).

У кого-то есть идеи, как решить эту проблему?

Мне нужно генерировать событие каждые 1 мс, где я буду вызывать другую функцию. Как холодно я генерирую событие каждые 1 мс? Или меньше этого, если это возможно.

Человек из другого форума сказал мне, чтобы я создал тему для этой работы, но я не знаю, как это сделать.

Я использую 64-битную версию Windows 7, я не знаю, связана ли эта проблема с 64-битной ОС. Я думаю, что компьютерного оборудования достаточно для генерации события. Core 2 Duo 2 ГГц и 3 ГБ оперативной памяти.

http://img716.imageshack.us/img716/3627/teste1ms.png

1 Ответ

0 голосов
/ 10 ноября 2011

System.Windows.Forms.Timer утверждает, что

Компонент Windows Forms Timer является однопоточным и имеет точность не более 55 миллисекунд

Так что это должно объяснить несоответствие. Ваш подход кажется немного неправильным ИМХО. Пробуждение потока каждые 1 мс, и это слишком сложно сделать в вытесняющей многозадачной ОС.

Вместо этого вы можете

  1. Инициализировать счетчик на ноль, переменную времени высокой точности для текущего времени.
  2. Таймер будит вас периодически
  3. Когда вы запускаете таймер, используйте высокоточный таймер, чтобы найти текущее время.
  4. Вычислить дельту между новым старым высокоточным временем и счетчиком приращений столько, сколько вы ожидаете, либо вызывать некоторую функцию обратного вызова столько раз.

Этот подход будет более точным, чем любое событие таймера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...