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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.84
dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
#1

Завершение бесконечного цикла через определенное время - C++

17.10.2013, 19:37. Просмотров 2611. Ответов 62
Метки нет (Все метки)

Есть бесконечный цикл for( ; ; ), который обрабатывает событие нажатия кнопки в игре.
Если на кнопку не нажали в течении двух секунд, нужно, чтобы цикл завершался, как это можно сделать?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.10.2013, 19:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Завершение бесконечного цикла через определенное время (C++):

Очистка экрана в консоли через определенное время - C++
Результат стоит в консоли секунду потом происходит очистка экрана. как такое можно реализовать??

Изменить значение переменной через определенное время - C++
Всем доброго времени суток. Допустим есть значение a=10; Надо его изменить на a=15 и что бы оно так держалось допустим в течени часа,...

На какой отметке остановится мотоциклист через определенное время? - C++
Длина Московской кольцевой автомобильной дороги —109 километров. Байкер Вася стартует с нулевого километра МКАД и едет со скоростью...

Как сделать обновление текста строки через определенное время? - C++
Здравствуйте. Как сделать обновление текста строки через определенное время? #include <iostream> #include <string> #include...

Открыть и закрыть файл exe через определенное время - C++
Извините за тупой вопрос. Мне нужно просто открыть экзешник и со временем,например 5 секунд,чтобы сам просто закрылся. То есть просто...

Помогите решить задачу(Гражданин открыл счет в банке. Определить прирост и сумму вклада через определенное время) - C++
Помогите решить задачи через цикл do _ while: 2) Гражданин 1 марта открыл счет в банке вложив 1000 руб. Через каждый месяц размер...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
21.10.2013, 20:27  [ТС] #31
Почему-то получается, что таймер мгновенно начинается и заканчивается,
какое-бы значение в миллисекундах не было указано

C++
1
2
3
4
5
6
7
8
SDL_NewTimerCallback C_SceneElements::callback() {
    timeToDisplayBeaverInSeconds /= 2;
    return 0;
}
 
void someFunction() {
    SDL_TimerID timer60Seconds = SDL_AddTimer(5000, callback(), NULL);
}
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2013, 20:38 #32
У вас это компилируется?
1
dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
21.10.2013, 20:39  [ТС] #33
Цитата Сообщение от alsav22 Посмотреть сообщение
У вас это компилируется?
Да. Я понимаю, что это неправильно, но уже перепробовал много вариантов
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2013, 20:50 #34
Цитата Сообщение от dimakozyr Посмотреть сообщение
Да.
Странно...

Добавлено через 2 минуты
callback() должна возвращать интервал, а не SDL_NewTimerCallback, и принимать два параметра.

Добавлено через 1 минуту
У SDL_AddTimer() второй параметр не должен быть вызовом функции.

Добавлено через 4 минуты
Вот прототип callback:
C++
1
Uint32 my_callbackfunc(Uint32 interval, void *param);
Вот прототип SDL_AddTimer:
C++
1
SDL_TimerID SDL_AddTimer(Uint32 interval, SDL_TimerCallback callback, void* param);
1
dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
21.10.2013, 21:44  [ТС] #35
Я так уже тоже делал, сейчас таймер имеет вид:
C++
1
2
3
4
5
6
7
8
Uint32 C_SceneElements::callback(Uint32 interval, void *param) {
    timeToDisplayBeaverInSeconds /= 2;
    return interval;
}
 
void someFunction() {
    SDL_TimerID SDL_AddTimer(Uint32 interval, SDL_TimerCallback callback, void* param);
}
Теперь SDL_AddTimer нужно как-то вызвать?
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2013, 22:00 #36
Компилируется?
1
dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
21.10.2013, 22:02  [ТС] #37
Цитата Сообщение от alsav22 Посмотреть сообщение
Компилируется?
Да, но эффекта никакого
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2013, 22:04 #38
Цитата Сообщение от dimakozyr Посмотреть сообщение
Да, но эффекта никакого
А код, из 31 поста, тоже компилировался?
1
dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
21.10.2013, 22:05  [ТС] #39
Цитата Сообщение от alsav22 Посмотреть сообщение
А код, из 31 поста, тоже компилировался?
Тоже
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2013, 22:20 #40
Проект выложите.
1
dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
21.10.2013, 22:28  [ТС] #41
Вот, таймер описал в файле C_SceneElements.cpp
в методах callback и scene_2_events
0
Вложения
Тип файла: 7z Beaver.7z (4.59 Мб, 2 просмотров)
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2013, 23:20 #42
Цитата Сообщение от dimakozyr Посмотреть сообщение
scene_2_events
Т.е., вот это есть создание таймера?
C++
1
SDL_TimerID SDL_AddTimer(Uint32 interval, SDL_TimerCallback callback, void* param);
Добавлено через 15 минут
C++
1
 SDL_TimerID timer_id = SDL_AddTimer(2000, callback, this);
Уберите callback из методов класса.
C++
1
2
3
4
5
6
7
Uint32 callback(Uint32 interval, void *param) 
{
    SDL_WM_SetCaption("60 sec", NULL);
    C_SceneElements* p = (C_SceneElements*)param;
    p ->gettimeToDisplayBeaverInSeconds() /= 2;
    return interval;
}
Добавьте в C_SceneElements:
C++
1
2
int& gettimeToDisplayBeaverInSeconds()
      { return timeToDisplayBeaverInSeconds; }
1
dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
22.10.2013, 11:24  [ТС] #43
Цитата Сообщение от alsav22 Посмотреть сообщение
Уберите callback из методов класса.
Цитата Сообщение от alsav22 Посмотреть сообщение
Добавьте в C_SceneElements:
Сделал:
C++
1
2
3
4
5
6
7
8
9
10
11
// C_SceneElements.h
int& gettimeToDisplayBeaverInSeconds()
        { return timeToDisplayBeaverInSeconds; }
 
// C_SceneElements.cpp
Uint32 callback(Uint32 interval, void *param) {
    SDL_WM_SetCaption("60 sec", NULL);
    C_SceneElements* p = (C_SceneElements*)param;
    p -> gettimeToDisplayBeaverInSeconds() /= 2;
    return interval;
}
Но не пойму, как теперь запустить таймер и где выставляется время 60 секунд?
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.10.2013, 11:31 #44
Цитата Сообщение от dimakozyr Посмотреть сообщение
Но не пойму, как теперь запустить таймер и где выставляется время 60 секунд?
Запускается сам, при создании, там же (первым параметром) - интервал работы).
1
dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
22.10.2013, 11:41  [ТС] #45
Цитата Сообщение от alsav22 Посмотреть сообщение
Запускается сам, при создании, там же (первым параметром) - интервал работы)
Если он запускается сам, то как тогда передать функции callback параметр 60сек?

Добавлено через 6 минут
И нужно, чтобы таймер запускался не сразу при старте программы,
а при переходе на вторую игровую сцену с бобрами
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.10.2013, 11:41
Привет! Вот еще темы с ответами:

Досрочное завершение цикла for - C++
for (int i = 0; i < n; i++) { cin >> names >> scores; } // прекратить ввод введение строки No More если даже i не достиг...

Отладка бесконечного цикла - C++
Здравствуйте. Проблема такая, написал цикл программы взаимодействия пользователя с меню Цикл не имеет условия выхода, что бы выйти...

Условие завершение цикла с использованием структуры - C++
Доброе время суток! Я новичок на этом форуме и если че не так не ругайтесь. У меня такой вопрос как задать условие выхода из цикла....

Завершение цикла при вводе EOF - C++
Пишу небольшую программку и в ней имеется вот такой код: typedef std::istream_iterator<std::string> string_input; for...


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

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

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