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

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

17.10.2013, 19:37. Показов 7720. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты 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: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru