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

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

17.10.2013, 19:37. Показов 7023. Ответов 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
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
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
5500 / 4895 / 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
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
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
5500 / 4895 / 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
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
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
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
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
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
162 / 29 / 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
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
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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru