2015-01-16 2 views
2

У меня есть программа в Delphi, которая принимает фреймы из внешнего приложения в 25 герцах (25 раз в секунду), а затем преобразует их в 60 герц (60 кадров в секунду), создавая 1 -2 дополнительных кадра. Мне нужно вывести эти дополнительные кадры, непрерывно создавая буфер кадров и выводя из него фреймы из отдельного потока. Проблема в том, что 1000/60 составляет 16.66667, что означает, что я не могу просто отправить кадры в «интервал» на 16 или 17 миллисекунд, мне нужно, чтобы это было более точно. Как это сделать в Delphi/Windows?Delphi таймер более точный, чем миллисекунды

+0

см. Https://sergworks.wordpress.com/2010/04/06/a-better-timer-for-a-delphi-programmer/ – kludg

+0

похоже, что вам нужен 'TStopWatch' - http : //docwiki.embarcadero.com/Libraries/XE7/en/System.Diagnostics.TStopwatch – kludg

+0

Используйте таймер 1 мс, отправьте два кадра на 17 мс, а затем один на 16 мс. –

ответ

2

Вы, вероятно, нужно использовать оба следующих:

  1. Высокое разрешение таймера. Это доступно через функцию Win32 QueryPerformanceCounter, а также обернуто по типу Delphi TStopwatch.
  2. A waitable timer. Это позволяет вам установить дату платежа в будущем и иметь блок потока, и просыпаться в установленный срок.

Оба они имеют более высокое разрешение, чем таймер GUI, и должны быть достаточными для ваших нужд. Прочтите обзор: http://msdn.microsoft.com/en-gb/library/windows/desktop/ms644900.aspx

+0

Ожидаемые таймеры основаны на одном и том же ядре часового механизма планировщика ядра, поэтому не более точны, если вы не выполняете ['NtSetTimerResolution'] (http://undocumented.ntinternals.net/source/usermode/undocumented%20functions/time/ntsettimerresolution. html), см. http://www.virtualdub.org/blog/pivot/entry.php?id=272 –

Смежные вопросы