С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.93/30: Рейтинг темы: голосов - 30, средняя оценка - 4.93
 Аватар для dimakozyr
162 / 29 / 3
Регистрация: 17.08.2013
Сообщений: 560

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

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

Студворк — интернет-сервис помощи студентам
Есть бесконечный цикл for( ; ; ), который обрабатывает событие нажатия кнопки в игре.
Если на кнопку не нажали в течении двух секунд, нужно, чтобы цикл завершался, как это можно сделать?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.10.2013, 19:37
Ответы с готовыми решениями:

Завершение Messagebox через определенное время
Подскакжите, пожалуйста, как можно реализовать таую вещь - например, находится файл в директории, каждую минуту папка сканируется, при...

Завершение бесконечного цикла по нажатию CTRL + D
Имеется программа, которая должна брать вводимые числа из массива и выводить всё описанное. Работает для i = 5 но по задаче количество...

Завершение сеансов всех пользователей и их программ в определенное время
Добрый день, коллеги, такой вопрос - если можно Как в windows server 2012R2 создать задание по закрытию всех пользователей и их программ...

62
 Аватар для dimakozyr
162 / 29 / 3
Регистрация: 17.08.2013
Сообщений: 560
21.10.2013, 22:28  [ТС]
Студворк — интернет-сервис помощи студентам
Вот, таймер описал в файле C_SceneElements.cpp
в методах callback и scene_2_events
Вложения
Тип файла: 7z Beaver.7z (4.59 Мб, 4 просмотров)
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2013, 23:20
Цитата Сообщение от 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
162 / 29 / 3
Регистрация: 17.08.2013
Сообщений: 560
22.10.2013, 11:24  [ТС]
Цитата Сообщение от 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
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
22.10.2013, 11:31
Цитата Сообщение от dimakozyr Посмотреть сообщение
Но не пойму, как теперь запустить таймер и где выставляется время 60 секунд?
Запускается сам, при создании, там же (первым параметром) - интервал работы).
1
 Аватар для dimakozyr
162 / 29 / 3
Регистрация: 17.08.2013
Сообщений: 560
22.10.2013, 11:41  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
Запускается сам, при создании, там же (первым параметром) - интервал работы)
Если он запускается сам, то как тогда передать функции callback параметр 60сек?

Добавлено через 6 минут
И нужно, чтобы таймер запускался не сразу при старте программы,
а при переходе на вторую игровую сцену с бобрами
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
22.10.2013, 11:51
Цитата Сообщение от dimakozyr Посмотреть сообщение
Если он запускается сам, то как тогда передать функции callback параметр 60сек?
При создании таймера, автоматически вызывается функция callback, куда передаётся (первым параметром - interval) интервал работы таймера (первый параметр в функции создания таймера), вторым параметром любой параметр пользователя. Из функции callback возвращается новое значение интервала работы таймера. Если возвратится 0, то таймер будет остановлен.

Добавлено через 2 минуты
Цитата Сообщение от dimakozyr Посмотреть сообщение
И нужно, чтобы таймер запускался не сразу при старте программы,
а при переходе на вторую игровую сцену с бобрами
По-моему, он так и запускается. Чтобы видеть это, запустите программу как консоль, и в callback сделайте какой-нибудь вывод на консоль. Будет видно: когда таймер запускается и как работает.
1
 Аватар для dimakozyr
162 / 29 / 3
Регистрация: 17.08.2013
Сообщений: 560
22.10.2013, 12:22  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
вторым параметром любой параметр пользователя
То есть для этого и нужна функция *timeToDisplayBeaverInSeconds()?
Иначе не понимаю ее назначение
C++
1
2
3
4
5
6
Uint32 callback(Uint32 interval, void *timeToDisplayBeaverInSeconds()) {
    SDL_WM_SetCaption("60 sec", NULL);
    C_SceneElements* p = (C_SceneElements*)timeToDisplayBeaverInSeconds();
    p -> gettimeToDisplayBeaverInSeconds() /= 2;
    return interval;
}
timeToDisplayBeaverInSeconds определен внутри класса, а callback за пределами класса,
в callback и в timeToDisplayBeaverInSeconds сделал вывод в консоль, но ничего не выводится

Добавлено через 6 минут
Разобрался с *timeToDisplayBeaverInSeconds(), нужно вторым аргументом передавать не ее, а функцию, возвращающую 60 секунд
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
22.10.2013, 12:38
Цитата Сообщение от dimakozyr Посмотреть сообщение
То есть для этого и нужна функция *timeToDisplayBeaverInSeconds()?
Иначе не понимаю ее назначение
Где это там такая функция?
1
 Аватар для dimakozyr
162 / 29 / 3
Регистрация: 17.08.2013
Сообщений: 560
22.10.2013, 12:45  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
Добавьте в C_SceneElements:
int& gettimeToDisplayBeaverInSeconds()
* * * { return timeToDisplayBeaverInSeconds; }
Вот, но с этим уже разобрался. Беда в том, что почему-то таймер не запускается
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
22.10.2013, 13:03
Цитата Сообщение от dimakozyr Посмотреть сообщение
Вот,
У вас проблемы с копипастом?
Вот это: gettimeToDisplayBeaverInSeconds(), и это: *timeToDisplayBeaverInSeconds(), по-вашему, выглядит одинаково?

Добавлено через 6 минут
Цитата Сообщение от dimakozyr Посмотреть сообщение
Иначе не понимаю ее назначение
Назначение её такое. У вас в callback() есть обращение к полю класса C_SceneElements. Зачем это, и почему - меня не интересует, это ваш код. Сделать callback методом класса не получается (наверное, она так задумана), поэтому я предложил такой способ: добавить в класс метод доступа к нужному полю (int& gettimeToDisplayBeaverInSeconds()), а в callback() передавать, вторым параметром, указатель на объект класса, и через него, и функцию доступа к полю, делать обращение к полю класса.
1
 Аватар для dimakozyr
162 / 29 / 3
Регистрация: 17.08.2013
Сообщений: 560
22.10.2013, 13:21  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
а в callback() передавать, вторым параметром, указатель на объект класса
Под объектом имеется ввиду любой метод и экземпляр данного класса?

Т.е. можно записать так:
C++
1
Uint32 callback(Uint32 interval, void *gettimeToDisplayBeaverInSeconds())..
и так:
C++
1
2
C_SceneElements obj;
Uint32 callback(Uint32 interval, void *obj) {
У меня-же сейчас правильно записан код на скриншотах?
Вызываю метод gettimeToDisplayBeaverInSeconds(), он запускается, а таймер все еще не запускается,
в нем не срабатывает вывод в консоль
Миниатюры
Завершение бесконечного цикла через определенное время   Завершение бесконечного цикла через определенное время  
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
22.10.2013, 13:48
Цитата Сообщение от dimakozyr Посмотреть сообщение
У меня-же сейчас правильно записан код на скриншотах?
Вы пишите непонятно что.

Добавлено через 48 секунд
Цитата Сообщение от dimakozyr Посмотреть сообщение
Вызываю метод gettimeToDisplayBeaverInSeconds(),
Где?

Добавлено через 3 минуты
Цитата Сообщение от dimakozyr Посмотреть сообщение
Под объектом имеется ввиду любой метод и экземпляр данного класса?
Т.е. можно записать так:
Я пишу о том что передаётся:
C++
1
SDL_TimerID timer_id = SDL_AddTimer(5000, callback, this);
this - это указатель на объект класса, который передаётся в callback().
А вы пишите о том, что принимается в callback(). Приниматься там должно то, что написано в прототипе, и не нужно там непонятно что писать.

Добавлено через 9 минут
Цитата Сообщение от dimakozyr Посмотреть сообщение
а таймер все еще не запускается,
Где и как он создаётся?
1
 Аватар для dimakozyr
162 / 29 / 3
Регистрация: 17.08.2013
Сообщений: 560
22.10.2013, 15:05  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
Сообщение от dimakozyr
Вызываю метод gettimeToDisplayBeaverInSeconds(),
Где?
В файле C_SceneElements.cpp:
C++
1
2
3
4
5
6
clock_t start = clock();
while (((double)(clock() - start) / CLOCKS_PER_SEC) < timeToDisplayBeaverInSeconds)
if (SDL_PollEvent(getEvent())) {
    gettimeToDisplayBeaverInSeconds();
...
}
Цитата Сообщение от alsav22 Посмотреть сообщение
Сообщение от dimakozyr
а таймер все еще не запускается,
Где и как он создаётся?
Это я и пытаюсь выяснить

C++
1
SDL_TimerID timer_id = SDL_AddTimer(5000, callback, this);
Если поместить этот код перед gettimeToDisplayBeaverInSeconds(); (т.к. не знаю, куда его нужно помещать), то для callback выдает ошибку:
аргумент типа "Uint32 (*)(Uint32 interval, void *(*gettimeToDisplayBeaverInSeconds)())" несовместим с параметром типа "SDL_NewTimerCallback"
0
22.10.2013, 15:08

Не по теме:

Я на сколько ваших вопросов уже ответил?

1
 Аватар для dimakozyr
162 / 29 / 3
Регистрация: 17.08.2013
Сообщений: 560
22.10.2013, 15:10  [ТС]
Ладно, спасибо, постараюсь сам доразбираться
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
22.10.2013, 15:17
Я о другом...
Цитата Сообщение от dimakozyr Посмотреть сообщение
В файле C_SceneElements.cpp:
С какой целью вы вызываете этот метод?
C++
1
gettimeToDisplayBeaverInSeconds();
Добавлено через 2 минуты
Он меняет название окна и возвращает ссылку на поле класса, которая вами никак не используется. В чём смысл вызова?

Добавлено через 2 минуты
Цитата Сообщение от dimakozyr Посмотреть сообщение
т.к. не знаю, куда его нужно помещать
Чем не устроило первоначальное расположение вызова функции создание таймера?
0
 Аватар для dimakozyr
162 / 29 / 3
Регистрация: 17.08.2013
Сообщений: 560
22.10.2013, 15:17  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
С какой целью вы вызываете этот метод?
gettimeToDisplayBeaverInSeconds();
Я думал, что таким образом я запускаю callback.
Но теперь я понял, что наоборот это он вызывается из функции callback,
которая должна запускаться автоматически
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
22.10.2013, 15:23
Так оно и есть.

Добавлено через 2 минуты
По-идее, в callback нужно сделать вызов функции для перерисовки. Потом отслеживать нажатие кнопки мыши, и если происходит, то удалять таймер. Как-то так...
0
 Аватар для dimakozyr
162 / 29 / 3
Регистрация: 17.08.2013
Сообщений: 560
22.10.2013, 15:26  [ТС]
Но callback не запускается автоматически.

Сейчас из того, что касается таймера в проекте есть код:
// C_SceneElements.h
C++
1
2
3
4
struct C_SceneElements{
    int& gettimeToDisplayBeaverInSeconds()
        { return timeToDisplayBeaverInSeconds; }
};
// C_SceneElements.cpp
C++
1
2
3
4
5
6
7
#include "C_SceneElements.h"
Uint32 callback(Uint32 interval, void *gettimeToDisplayBeaverInSeconds()) {
    SDL_WM_SetCaption("60 sec", NULL);
    C_SceneElements* p = (C_SceneElements*)gettimeToDisplayBeaverInSeconds();
    p -> gettimeToDisplayBeaverInSeconds() /= 2;
    return interval;
}
А вот куда помещать SDL_TimerID timer_id = SDL_AddTimer(5000, callback, this); я не совсем понимаю

Добавлено через 1 минуту
Цитата Сообщение от alsav22 Посмотреть сообщение
По-идее, в callback нужно сделать вызов функции для перерисовки. Потом отслеживать нажатие кнопки мыши, и если происходит, то удалять таймер. Как-то так...
Это сделать не сложно, но нужно, чтобы callback запускался.
Я это определяю по функции SDL_WM_SetCaption("60 sec", NULL), а она не срабатывает
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
22.10.2013, 15:29
Цитата Сообщение от dimakozyr Посмотреть сообщение
А вот куда помещать SDL_TimerID timer_id = SDL_AddTimer(5000, callback, this); я не совсем понимаю
По этому поводу я вопрос задал. Ответа не получил.

Добавлено через 2 минуты
Цитата Сообщение от dimakozyr Посмотреть сообщение
Я это определяю по функции SDL_WM_SetCaption("60 sec", NULL), а она не срабатывает
callback() - это функция обратного вызова. Она автоматически вызывается при определённом событии. В данном случае, при срабатывании таймера. Если вы его не создаёте, как может вызваться callback()?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.10.2013, 15:29
Помогаю со студенческими работами здесь

Нет ответа на команды во время выполнения бесконечного цикла
Здравствуйте. Такая проблема. Есть код мини игры, если её можно так назвать, в которой после &quot;покупки&quot; некой вещи к значению...

Как можно прервать выполнение цикла на определенное время?
&lt;? $y=0; for ($i=0; $i&lt;100; $i++){ $y++; if ($y==4){ # здесь нужно прервать цикл, скажем на 1 минуту... $y=0; } } ...

Как проходить через цикл через определенное время
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using...

Самозапуск через определенное время?
Прошу помочь мне заставить программу самозапускаться ч/з определенное время. Заранее благодарен, Serj. Мой адрес: leyftd@mail.ru

Загрузка через определённое время
Многие видели на сайтах есть загрузка файла через опеределённое времмя .. у кого есть исходник ? глянуть хочу . или дайте ссылку почитать .


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru