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

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

17.10.2013, 19:37. Показов 7312. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru