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

Вызов функции с определенной частотой - C++

Восстановить пароль Регистрация
 
zram
0 / 0 / 0
Регистрация: 09.01.2013
Сообщений: 18
14.07.2013, 14:08     Вызов функции с определенной частотой #1
Всем привет, бьюсь над задачей: необходимо вызывать функцию с определенной частотой например 30КГц. Кто сталкивался с подобной задачей?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4838 / 2977 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
14.07.2013, 15:24     Вызов функции с определенной частотой #2
Через фичи C++11:
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
#include <iostream>
#include <chrono>
#include <thread>
 
using namespace std;
 
enum {
    FREQ_HZ = 100,
    INV_FREQ_HZ = 1000000 / FREQ_HZ
};
 
void func() {
    std::cout << "*";
}
 
int main()
{
    for ( ; ; ) {
        chrono::high_resolution_clock::time_point t = chrono::high_resolution_clock::now();
 
        func();
 
        int us = chrono::duration_cast< chrono::microseconds >( chrono::high_resolution_clock::now() - t ).count();
        if ( us < INV_FREQ_HZ ) {
            this_thread::sleep_for( chrono::microseconds( INV_FREQ_HZ - us ) );
        }
    }
 
    return 0;
}
Правда в Windows, GCC не даёт мне микросекунды через high_resolution_clock ...

Добавлено через 43 минуты
Зато boost даёт нам такую точность...
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
#define BOOST_THREAD_USE_LIB
 
#include <boost/chrono.hpp>
#include <boost/thread.hpp>
#include <iostream>
#include <iomanip>
#include <cstdlib>
 
using namespace std;
 
enum {
    FREQ_HZ = 1000,
    INV_FREQ_HZ = 1000000 / FREQ_HZ
};
 
void dummy() {
    boost::this_thread::sleep( boost::posix_time::microseconds( rand() % 2000 + 1000 ) );
}
 
int main()
{
    for ( ; ; ) {
        boost::chrono::high_resolution_clock::time_point t = boost::chrono::high_resolution_clock::now();
 
        dummy();
 
        int us = boost::chrono::duration_cast< boost::chrono::microseconds >( boost::chrono::high_resolution_clock::now() - t ).count();
        cout << us;
 
        if ( us < INV_FREQ_HZ ) {
            boost::this_thread::sleep( boost::posix_time::microseconds( INV_FREQ_HZ - us ) );
            cout << ", " << INV_FREQ_HZ - us;
        }
        cout << endl;
    }
 
    return 0;
}
Убежденный
Системный программист
 Аватар для Убежденный
14175 / 6190 / 982
Регистрация: 02.05.2013
Сообщений: 10,298
Завершенные тесты: 1
14.07.2013, 15:38     Вызов функции с определенной частотой #3
Цитата Сообщение от zram Посмотреть сообщение
Всем привет, бьюсь над задачей: необходимо вызывать функцию с определенной частотой например 30КГц. Кто сталкивался с подобной задачей?
Эта задача полностью решается только в системах реального времени.
Windows, например, таковой не является. Во время работы функции может
произойти какое-нибудь внешнее событие, - прерывание, например, - в
результате которого выполнение потока будет приостановлено на
неопределенное время.
zram
0 / 0 / 0
Регистрация: 09.01.2013
Сообщений: 18
14.07.2013, 17:23  [ТС]     Вызов функции с определенной частотой #4
Цитата Сообщение от Убежденный Посмотреть сообщение
Эта задача полностью решается только в системах реального времени.
Windows, например, таковой не является. Во время работы функции может
произойти какое-нибудь внешнее событие, - прерывание, например, - в
результате которого выполнение потока будет приостановлено на
неопределенное время.

да, я это учитываю прерывания допустимы . спасибо
lazybiz, то что надо!
Yandex
Объявления
14.07.2013, 17:23     Вызов функции с определенной частотой
Ответ Создать тему
Опции темы

Текущее время: 22:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru