Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Реализация таймера, пакет Borland C 3.1 
V
    Опции темы
Aver91
Дата 8.5.2009, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 8.5.2009

Репутация: нет
Всего: нет



прошу помочь с такой проблемой: в программе нужен отсчет времени: время увеличивается с нуля до определенного момента и потом останавливается. причем должен быть обязательно вывод на экран этого времени.
 smile   
PM MAIL   Вверх
andrew_121
Дата 8.5.2009, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Aver91, Получи системное время(оно в милисекундах), это старт. И в цикле получай его же, сравнивай со стартовым временем плюс время задержки. Когда равно, прерываешь цикл.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
J0ker
Дата 8.5.2009, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



Цитата(andrew_121 @  8.5.2009,  11:46 Найти цитируемый пост)
Aver91, Получи системное время(оно в милисекундах), это старт. И в цикле получай его же, сравнивай со стартовым временем плюс время задержки. Когда равно, прерываешь цикл. 

правильно
отопительный прибор из процессора всегда вызывал у меня восхищение


--------------------
user posted image
PM MAIL   Вверх
Aver91
Дата 8.5.2009, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 8.5.2009

Репутация: нет
Всего: нет



Цитата

Aver91, Получи системное время(оно в милисекундах), это старт. И в цикле получай его же, сравнивай со стартовым временем плюс время задержки. Когда равно, прерываешь цикл.


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

хотелось бы, чтобы описать как то функциями "старт" часов и функцией "конец" часов. нечто подобное
PM MAIL   Вверх
math64
Дата 9.5.2009, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



При использовании время считается не в миллисекундах, в прерываниях таймера (около 18 раз в секунду)
Считать счетчик самого таймера (в 64К раз быстрее):
Код

static unsigned near readtimer (void)
{
  asm pushf                    // Save interrupt flag
  asm cli                      // Disable interrupts
  asm mov  al,  0h             // Latch timer 0
  asm out  43h, al
      dummy ();                // Waste some time
  asm in   al,  40h            // Counter --> bx
  asm mov  bl,  al             // LSB in BL
      dummy ();                // Waste some time
  asm in   al,  40h
  asm mov  bh,al               // MSB in BH
  asm not  bx                  // Need ascending counter
  asm popf                     // Restore interrupt flag
  return _BX;
}


PM   Вверх
rrrFer
Дата 10.5.2009, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.5.2008
Где: Красноярск

Репутация: 1
Всего: 1



Aver91
может не совсем в тему, ну вот:
Код

#include <time.h>
#include <stdio.h>
#include <process.h>
bool fl=0;
void timer(void *p){
    signal(SIGTERM,SIG_DFL);
    int itimer=reinterpret_cast<int>(p);
    time_t t0,t1;
    time(&t0);
    do{
        time(&t1);
    }while(difftime(t1,t0)<itimer);
                fl=1;
}
int main(void){
    beginthread(timer,1024,(void*)5);
    for(;!fl;);
    system("pause");
    return 0;
}

а еще может и неработать(тогда напиши), не проверял я а-то.

Добавлено через 1 минуту и 7 секунд
строчку signal(SIGTERM,SIG_DFL); надо убрать еще, осталась с другой программы )
PM MAIL WWW ICQ   Вверх
math64
Дата 10.5.2009, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



rrrFer - какие beginthread? Топикстартер пишет на Borland C++ 3.1, значит под DOS
(хотя там есть возможность посать под Windows 3.1, но это сейчас смысла не имеет)
PM   Вверх
Aver91
Дата 11.5.2009, 06:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 8.5.2009

Репутация: нет
Всего: нет



Цитата(rrrFer @ 10.5.2009,  15:45)
Aver91
может не совсем в тему, ну вот:
Код

#include <time.h>
#include <stdio.h>
#include <process.h>
bool fl=0;
void timer(void *p){
    signal(SIGTERM,SIG_DFL);
    int itimer=reinterpret_cast<int>(p);
    time_t t0,t1;
    time(&t0);
    do{
        time(&t1);
    }while(difftime(t1,t0)<itimer);
                fl=1;
}
int main(void){
    beginthread(timer,1024,(void*)5);
    for(;!fl;);
    system("pause");
    return 0;
}

а еще может и неработать(тогда напиши), не проверял я а-то.

Добавлено @ 15:46
строчку signal(SIGTERM,SIG_DFL); надо убрать еще, осталась с другой программы )

убрал строчку, но прога не работает, т.к. описание типа bool ему не нравится, ну и функция beginthread должна быть описана
PM MAIL   Вверх
math64
Дата 11.5.2009, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



bool заменяешь на int + enum { false, true};
reinterpret_cast<int>(p) на (int)(p)
а beginthread у тебя нет - только один поток, timer() можешь вызвать только как обычную функцию.
PM   Вверх
fry
Дата 12.5.2009, 01:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 4.10.2006

Репутация: нет
Всего: 3



По моему, "кому-то" ( потоку ) все равно придется проверять время на достижение некоторого значения. Т.к. поток один, то ему и корпеть. Также вариант, предложенный andrew_121, может несколько затормаживать постоянным переключением контекстов при взятии времени. Думаю простым, но не знаю насколько красивым, вариантом может являться просто сокращение количества вызова в соответствии с необходимой разрешающей способностью, т.е. создать некоторый счетчик и по достижении им 0 делать замер. Так можно сократить количество вызовов в 2^16 или в 2^32 раза, что по моему очень прилично.

При этом есть только одно существенное ограничение. Воизбежание существенного изменения частоты выборок необходимо, чтобы остальной код не блокировался в функциях надолго.

ЗЫ Получится "грелка" поменьше. Сам я делал подобную штуку через дополнительный поток.
Вроде еще есть системный вызов alarm, работающий как таймер через сигналы, но это уже POSIX. Я к тому, что может есть что подобное.

Это сообщение отредактировал(а) fry - 12.5.2009, 08:08
PM MAIL   Вверх
math64
Дата 12.5.2009, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Можно перехватить прервывание от таймера (около 18 раз в секунду, не забыть вызвать перехваченное прерывание и вернуть всё обратно перед выходом из программы), в котором изменять volatile переменную, но в основном потоке всё равно нужно проверять значение этой переменной.
PM   Вверх
Aver91
Дата 12.5.2009, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 8.5.2009

Репутация: нет
Всего: нет



с проблемой разобрался, решил ее с помощью gettime() и парой ифов. сейчас работает. всем спасибо за проявленное терпение и помощь smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0959 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.