Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

[c++] Таймер в линукс

30K
25 сентября 2007 года
pilgrim.sa
9 / / 12.09.2007
Нужно сделать самый простой таймер в линухе, но по неизвестной причине std::clock() возвращает всегда 0. boots::timer использовать невозможно, так как в нем все идет через тот же std::clock... в чем может быть проблема?

p.s. система Debian
361
26 сентября 2007 года
Odissey_
661 / / 19.09.2006
приведи код использования std::clock(),
и что вызывается до него (может какой нить sleep() ?) и после.
30K
26 сентября 2007 года
pilgrim.sa
9 / / 12.09.2007
Цитата: Odissey_
приведи код использования std::clock(),
и что вызывается до него (может какой нить sleep() ?) и после.



Код:
#include <iostream>
#include "bv.h"
#include <ctime>

int main(int argc, char *argv[])
{
    int t_on = std::clock();

    BV tmp;
   
    int command = -1;
    std::cout<<"1 - Run\n";
    std::cout<<"2 - Stop\n";
    std::cout<<"3 - Cancel\n";
    while (command != 0)
    {
        std::cin>>command;
        switch ( command )
        {
            case 1: if (tmp.run(20)) std::cout<<"Started\n"; break;
            case 2: tmp.stop(); break;
            case 3: tmp.cancel(); break;
        }
    }

    int t_off = std::clock();

    std::cout << "Function completed in "
        << (static_cast<float>(t_off - t_on))/CLOCKS_PER_SEC
        << " seconds" << std::endl;

    return 0;
}

И в первом и во втором случае std::clock() возвращает 0
361
26 сентября 2007 года
Odissey_
661 / / 19.09.2006
Угу, так и не должно для функций не использующих CPU time - usleep и т.д. видимо cin <<, имеет аналогичное свойство.
Логичнее было бы так -
Код:
while (command != 0)
    {
        std::cin>>command;
        switch ( command )
        {
            case 1:
                {
                 int t_on = std::clock();
                 //if (tmp.run(20)) std::cout<<"Started\n"; break;
                 for (float i=0; i < 100000; i+=0.01);
                 int t_off = std::clock();

                 std::cout << "Function completed in "
                                   << (static_cast<double>(t_off - t_on))/CLOCKS_PER_SEC
                                   << " seconds" << std::endl;
                } break;
            case 2: tmp.stop(); break;
            case 3: tmp.cancel(); break;
        }
    }


Незнаю что у тебя там tmp.run(20) делает поэтому для примера вставил цикл.
502
14 октября 2007 года
Jail
550 / / 30.01.2007
[LEFT]А как насчёт подпрограммы обработчика прерываний системнго таймера? Кажется можно и на его базе построить необходимые вызовы.
void do_timer (struct pt_regs *regs)
{
jiffies_64++;
update_process_times(user_mode(regs));
update_times();
}
Макрос user_mode() просматривает состояние регистров процессора, regs, и возвращает значение 1, если прерывание возникло в пространстве пользователя, и значение 0- если в пространсте ядра. Кажись это можно приспособить в прикладной программе. Поправте если не прав :)
[/LEFT]
15K
02 ноября 2007 года
vja
85 / / 09.01.2007
а setitimer чем не устраивает?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог