![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Aver91 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 8.5.2009 Репутация: нет Всего: нет |
прошу помочь с такой проблемой: в программе нужен отсчет времени: время увеличивается с нуля до определенного момента и потом останавливается. причем должен быть обязательно вывод на экран этого времени.
![]() |
|||
|
||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
Aver91, Получи системное время(оно в милисекундах), это старт. И в цикле получай его же, сравнивай со стартовым временем плюс время задержки. Когда равно, прерываешь цикл.
-------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
||||
|
||||
Aver91 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 8.5.2009 Репутация: нет Всего: нет |
хмм, механизм я понял, но есть один нюанс. мне в программе нужно использовать время так, чтобы не удлинять основной цикл функции, т.к. чем меньше задержек будет происходить во время выполнения одной итерации, тем намного лучше. хотелось бы, чтобы описать как то функциями "старт" часов и функцией "конец" часов. нечто подобное |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
При использовании время считается не в миллисекундах, в прерываниях таймера (около 18 раз в секунду)
Считать счетчик самого таймера (в 64К раз быстрее):
|
|||
|
||||
rrrFer |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 208 Регистрация: 11.5.2008 Где: Красноярск Репутация: 1 Всего: 1 |
Aver91,
может не совсем в тему, ну вот:
а еще может и неработать(тогда напиши), не проверял я а-то. Добавлено через 1 минуту и 7 секунд строчку signal(SIGTERM,SIG_DFL); надо убрать еще, осталась с другой программы ) |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
rrrFer - какие beginthread? Топикстартер пишет на Borland C++ 3.1, значит под DOS
(хотя там есть возможность посать под Windows 3.1, но это сейчас смысла не имеет) |
|||
|
||||
Aver91 |
|
||||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 8.5.2009 Репутация: нет Всего: нет |
убрал строчку, но прога не работает, т.к. описание типа bool ему не нравится, ну и функция beginthread должна быть описана |
||||
|
|||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
bool заменяешь на int + enum { false, true};
reinterpret_cast<int>(p) на (int)(p) а beginthread у тебя нет - только один поток, timer() можешь вызвать только как обычную функцию. |
|||
|
||||
fry |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 4.10.2006 Репутация: нет Всего: 3 |
По моему, "кому-то" ( потоку ) все равно придется проверять время на достижение некоторого значения. Т.к. поток один, то ему и корпеть. Также вариант, предложенный andrew_121, может несколько затормаживать постоянным переключением контекстов при взятии времени. Думаю простым, но не знаю насколько красивым, вариантом может являться просто сокращение количества вызова в соответствии с необходимой разрешающей способностью, т.е. создать некоторый счетчик и по достижении им 0 делать замер. Так можно сократить количество вызовов в 2^16 или в 2^32 раза, что по моему очень прилично.
При этом есть только одно существенное ограничение. Воизбежание существенного изменения частоты выборок необходимо, чтобы остальной код не блокировался в функциях надолго. ЗЫ Получится "грелка" поменьше. Сам я делал подобную штуку через дополнительный поток. Вроде еще есть системный вызов alarm, работающий как таймер через сигналы, но это уже POSIX. Я к тому, что может есть что подобное. Это сообщение отредактировал(а) fry - 12.5.2009, 08:08 |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Можно перехватить прервывание от таймера (около 18 раз в секунду, не забыть вызвать перехваченное прерывание и вернуть всё обратно перед выходом из программы), в котором изменять volatile переменную, но в основном потоке всё равно нужно проверять значение этой переменной.
|
|||
|
||||
Aver91 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 8.5.2009 Репутация: нет Всего: нет |
с проблемой разобрался, решил ее с помощью gettime() и парой ифов. сейчас работает. всем спасибо за проявленное терпение и помощь
![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |