Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
-=MASTER=-
78 / 72 / 5
Регистрация: 15.03.2012
Сообщений: 259
#1

Как сделать стабильный таймер в Windows XP,7,8 с задержкой в одну микросекунду? - C++

26.11.2012, 15:34. Просмотров 1146. Ответов 7
Метки нет (Все метки)

Собственно вопрос в топике, главное, чтоб таймер был стабилен и не скакал и чтоб задержка была в одну микросекунду. Тоесть возможно ли в принципе это сделать на обычном виндусе, не прибегая к операционным системам реального времени...
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.11.2012, 15:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как сделать стабильный таймер в Windows XP,7,8 с задержкой в одну микросекунду? (C++):

как сделать таймер? - C++
вообщем нужно сделать таймер, для консольного приложения, если все время прошло, то выводится одно сообщение, если во время таймера нажали...

Сделать таймер как в Lost - C++
Подскажите где можно найти программу таймер как в сериале Лост, что б она требовала вводить код 4 8 15 16 23 42 каждые 108 минут Ну я...

Как сделать так, чтобы таймер рандомно выбирал одну из невидимых картинок и потом делал её видимой. - Delphi
Как сделать так что бы таймер рандомно выбирал из невидимых картинок и потом делал её видимой. А если картинка видима то он её не открывает...

Как сделать ввод чтобы был с задержкой как в консоли только в форме - C#
У меня такой вопрос как сделать ввод с задержкой не в консоли чтобы при нажатии на кнопку вводился 1 символ потом при нажатии еще раз на...

как в событии Timer отменить одну функцию но что бы таймер продолжал работать - Delphi
подскажите пожалусто пишу програму в дельфи там допустим точка движеться с равномерной скоростью использую компонент таймер для расчета...

Перемещать прямоугольник по вертикали с заданным шагом и задержкой в одну секунду - Turbo Pascal
Составить программу на языке программирования Турбо-Паскаль, выполняющую действия, описываемые в индивидуальном задании(Перемещать...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
-=ЮрА=-
Заблокирован
Автор FAQ
26.11.2012, 15:38 #2
Цитата Сообщение от -=MASTER=- Посмотреть сообщение
Собственно вопрос в топике, главное, чтоб таймер был стабилен и не скакал и чтоб задержка была в одну микросекунду. Тоесть возможно ли в принципе это сделать на обычном виндусе, не прибегая к операционным системам реального времени...
- Пффф, кончено можно сделать! Sleep(1) и вот она задержка 1 мсек.
0
-=ЮрА=-
Заблокирован
Автор FAQ
26.11.2012, 16:09 #3
-=MASTER=-, вот 2-х поточная реализация
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <windows.h>
#include <process.h>
#include <iostream>
using namespace std;
#pragma comment (lib,"user32.lib")
 
 
 
typedef struct
{
    UINT iTick;
    UINT iStop;
}TIME_PARAMS;
 
void timer(PVOID pParams);
 
int main()
{
    TIME_PARAMS pParam = {0};
    _beginthread(timer,0,&pParam);
    while(!pParam.iStop)
    {
        system("cls");
        cout<<"PRESS ESC FOR EXIT"<<endl;
        cout<<"NUM MILISECOND FROM START : "<<pParam.iTick<<endl;
        cout<<"NUM SECOND FROM START : "<<pParam.iTick / 1000<<endl;
        pParam.iStop = GetAsyncKeyState(VK_ESCAPE);
        Sleep(100);
    }
    return 0;
}
 
void timer(PVOID pParams)
{
    TIME_PARAMS * lpParams = (TIME_PARAMS *)pParams;
    while(!lpParams->iStop)
    {
        lpParams->iTick = lpParams->iTick + 10;
        if(lpParams->iTick == INT_MAX)
            lpParams->iTick = 0;
        Sleep(1);
    }
}
0
Миниатюры
Как сделать стабильный таймер в Windows XP,7,8 с задержкой в одну микросекунду?  
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
26.11.2012, 16:13 #4
-=ЮрА=-, http://msdn.microsoft.com/ru-ru/libr...=vs.85%29.aspx

This function causes a thread to relinquish the remainder of its time slice and become unrunnable for an interval based on the value of dwMilliseconds. The system clock "ticks" at a constant rate. If dwMilliseconds is less than the resolution of the system clock, the thread may sleep for less than the specified length of time. If dwMilliseconds is greater than one tick but less than two, the wait can be anywhere between one and two ticks, and so on. To increase the accuracy of the sleep interval, call the timeGetDevCaps function to determine the supported minimum timer resolution and the timeBeginPeriod function to set the timer resolution to its minimum. Use caution when calling timeBeginPeriod, as frequent calls can significantly affect the system clock, system power usage, and the scheduler. If you call timeBeginPeriod, call it one time early in the application and be sure to call the timeEndPeriod function at the very end of the application.
The default timer resolution on Windows 7 is 15.6 milliseconds (ms). Some applications reduce this to 1*ms, which reduces the battery run time on mobile systems by as much as 25 percent.
Ну и к слову. Миллисекунда и микросекунда не одно и тоже.
0
XRuZzz
Антикодер
676 / 577 / 28
Регистрация: 15.09.2012
Сообщений: 2,523
26.11.2012, 16:32 #5
так а винда позволяет работать с железом, которое может обеспечить эту точность, напрямую?
0
-=ЮрА=-
26.11.2012, 16:33
  #6

Не по теме:

ForEveR, я воспринял миллисекунду а не микросекунду, спасибо что обратил внимание

0
-=ЮрА=-
Заблокирован
Автор FAQ
26.11.2012, 17:44 #7
-=MASTER=-, так вот чтобы мой ответ был полным даю код ниже
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <windows.h>
#include <process.h>
using namespace std;
 
int main()
{
    LARGE_INTEGER li;
    double CPUFreq = 0.0;
    double OPTime  = 0.0;
    double OPmkSec = 0.0;
    if(!QueryPerformanceFrequency(&li))
        cout<<"QueryPerformanceFrequency error : "
            <<strerror(GetLastError())<<endl;
    else
    {
        CPUFreq = li.QuadPart*314; //314 = 2*PI*50 Hz
        OPTime  = 1.0/ CPUFreq;
        OPmkSec = 1E-6/ OPTime;
        cout<<"CPU Frequency : "<<CPUFreq<<" Hz\n";
        cout<<"Time of one operation : "<<OPTime<<" sec\n";
        cout<<"NUM of operations for one mkSec : "<<OPmkSec<<" operations\n";
    }
    return 0;
}
Что же сей код делает - а вот что он вычислит сколько единичных операций совершает ПК за 1 мкСек. За единичную операцию можно взять инкремент. Т.е к примеру число операций за 1 мкСек 1000-ча тогда цикл for с 1000-чей ++ будет эквивалентен по времени отработки 1 мкСек. Чтобы вычислить частоту CPU на борту можно воспользоваться функцией QueryPerformanceFrequency http://msdn.microsoft.com/ru-ru/libr...(v=vs.85).aspx она возвратит частоту процессора, которую нужно умножить на 314 радиан 2*Пи*50Гц.
Ниже скриншоты того что вывела утилита systeminfo и предлагаемый выше код, как видим на моём ПК с процессором 1100 МГц 1 мкСек соответсвует 1124 операции.
Как уверяет MSDN-овская справка
QueryPerformanceFrequency function Retrieves the frequency of the high-resolution performance counter, if one exists. The frequency cannot change while the system is running.
что весьма радует

Не по теме:

PS:Интересно каковы соображения товарища ForEveR на тему таймеров в ОС Windows

0
Миниатюры
Как сделать стабильный таймер в Windows XP,7,8 с задержкой в одну микросекунду?   Как сделать стабильный таймер в Windows XP,7,8 с задержкой в одну микросекунду?  
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
26.11.2012, 18:46 #8
-=ЮрА=-, QueryPerfomanceFrequency и QueryPerfomanceCounter помогут да. Только вот Windows все же не RTOS, поэтому могут быть и погрешности.http://stackoverflow.com/questions/8...ne-millisecond
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.11.2012, 18:46
Привет! Вот еще темы с ответами:

Перемещать круг по вертикали с заданным шагом и задержкой в одну секунду. - Pascal
вариант 4 :Перемещать круг по вертикали с заданным шагом и задержкой в одну секунду. Переделать вариант номер 4 для круга, вписанного в...

Перемещать круг по вертикали с заданным шагом и задержкой в одну секунду - Pascal
Программа должна состоять как минимум из двух частей – основной программы и модуля с описанием некоторых объектов – и работать на основе...

Как сделать таймер обратного отсчёта по нажатию на кнопку и сделать её неактивной - JavaScript
Снова пишу сюда, ибо нигде больше помощи не дождёшься:( Мне тут нужно сделать такую штуку: чтобы при нажатии на кнопку сработал таймер...

Перемещать треугольник по горизонтали с заданным шагом и задержкой в одну секунду (GraphABC) - PascalABC.NET
Перемещать треугольник по горизонтали с заданным шагом и задержкой в одну секунду.


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
26.11.2012, 18:46
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru