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

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

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

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

Добавлено через 2 минуты
Цитата Сообщение от dimakozyr Посмотреть сообщение
И нужно, чтобы таймер запускался не сразу при старте программы,
а при переходе на вторую игровую сцену с бобрами
По-моему, он так и запускается. Чтобы видеть это, запустите программу как консоль, и в callback сделайте какой-нибудь вывод на консоль. Будет видно: когда таймер запускается и как работает.
1
 Аватар для dimakozyr
383 / 30 / 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
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
22.10.2013, 12:38
Цитата Сообщение от dimakozyr Посмотреть сообщение
То есть для этого и нужна функция *timeToDisplayBeaverInSeconds()?
Иначе не понимаю ее назначение
Где это там такая функция?
1
 Аватар для dimakozyr
383 / 30 / 3
Регистрация: 17.08.2013
Сообщений: 560
22.10.2013, 12:45  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
Добавьте в C_SceneElements:
int& gettimeToDisplayBeaverInSeconds()
* * * { return timeToDisplayBeaverInSeconds; }
Вот, но с этим уже разобрался. Беда в том, что почему-то таймер не запускается
0
5500 / 4895 / 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
383 / 30 / 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
5500 / 4895 / 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
383 / 30 / 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
383 / 30 / 3
Регистрация: 17.08.2013
Сообщений: 560
22.10.2013, 15:10  [ТС]
Ладно, спасибо, постараюсь сам доразбираться
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
22.10.2013, 15:17
Я о другом...
Цитата Сообщение от dimakozyr Посмотреть сообщение
В файле C_SceneElements.cpp:
С какой целью вы вызываете этот метод?
C++
1
gettimeToDisplayBeaverInSeconds();
Добавлено через 2 минуты
Он меняет название окна и возвращает ссылку на поле класса, которая вами никак не используется. В чём смысл вызова?

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

Добавлено через 2 минуты
По-идее, в callback нужно сделать вызов функции для перерисовки. Потом отслеживать нажатие кнопки мыши, и если происходит, то удалять таймер. Как-то так...
0
 Аватар для dimakozyr
383 / 30 / 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
5500 / 4895 / 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
Ответ Создать тему
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru