Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.84
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
17.10.2013, 19:37     Завершение бесконечного цикла через определенное время #1
Есть бесконечный цикл for( ; ; ), который обрабатывает событие нажатия кнопки в игре.
Если на кнопку не нажали в течении двух секунд, нужно, чтобы цикл завершался, как это можно сделать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.10.2013, 19:37     Завершение бесконечного цикла через определенное время
Посмотрите здесь:

C++ Консоль. Завершение цикла нажатием клавиши
На какой отметке остановится мотоциклист через определенное время? C++
Условие завершение цикла с использованием структуры C++
Помогите решить задачу(Гражданин открыл счет в банке. Определить прирост и сумму вклада через определенное время) C++
Очистка экрана в консоли через определенное время C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6374 / 4840 / 442
Регистрация: 14.02.2011
Сообщений: 16,043
21.10.2013, 12:48     Завершение бесконечного цикла через определенное время #21
Цитата Сообщение от dimakozyr Посмотреть сообщение
Сейчас попробую, а почему цикл нужно забыть?
потому что когда он крутится окно может потерять событие
о оконной программы есть один стандартный цикл в котором она считывает события, и хватит
любой твой цикл тормозит тот цикл
вот примерно что тебе нужно
C++
1
2
3
4
5
6
7
8
9
10
11
12
void MyKeyDown()//функция в ответ на события нажатие клавиши WM_KEYDOWN
 {
  KillTimer(hWnd,1); // убьем таймер если он был запущен(если нет то ничего не произойдет)
  SetTimer(hWnd,1,2000);// создадим таймер на 2 секунды
/// чтото делаем в ответ на нажатие клавиши
 
 }
 
void  MyOnTimer()// функция в ответ на событие сработал таймер WM_TIMER
{
// что то делаем( убьем бобра) прошло 2 секунды
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
21.10.2013, 12:54  [ТС]     Завершение бесконечного цикла через определенное время #22
Создаю таймер. Когда он заканчивается, то возвращает значение(как я понял):

C++
1
2
if(!SetTimer(0, 1, 5000, (TIMERPROC)NULL))
    timeToDisplayBeaverInSeconds /= 2;
В деструкторе таймер удаляется:
C++
1
2
 ~C_SceneElements()
    { KillTimer(NULL, 1); }
По истечении 5 секунд таймер должен закончиться, и значение переменной timeToDisplayBeaverInSeconds должно уменьшиться, но ничего не происходит

Добавлено через 4 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
SetTimer(hWnd,1,2000);// создадим таймер на 2 секунды
Непонятно, что такое hWnd и разве не должно быть 4 аргумента?
Компилятор выдает ошибку, если только три указать
ValeryS
Модератор
6374 / 4840 / 442
Регистрация: 14.02.2011
Сообщений: 16,043
21.10.2013, 13:03     Завершение бесконечного цикла через определенное время #23
Цитата Сообщение от dimakozyr Посмотреть сообщение
Когда он заканчивается, то возвращает значение(как я понял):
нет
когда он "заканчивается" вызывается событие WM_TIMER, обрабатывай его
Цитата Сообщение от dimakozyr Посмотреть сообщение
if(!SetTimer(0, 1, 5000, (TIMERPROC)NULL))
* * timeToDisplayBeaverInSeconds /= 2;
это не слип он не останавливает программу на время

виндос событийная система
система посылает программе события(сообщения) и задача программы обработать это событие как можно быстрее и вернуть управление обратно системе, если этого не соблюдать то можно повесить систему
В этом отличие от консольных программ
это другая идеология, сравнить можно наверное с прерываниями

Добавлено через 2 минуты
Цитата Сообщение от dimakozyr Посмотреть сообщение
Непонятно, что такое hWnd и разве не должно быть 4 аргумента?
четвертый аргумент это адрес функции, которая вызовется когда сработает таймер
если он NULL то обрабатывается сообщение, я просто его упустил(описался)
Цитата Сообщение от dimakozyr Посмотреть сообщение
что такое hWnd
дескриптор твоего окна
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2013, 13:08     Завершение бесконечного цикла через определенное время #24
dimakozyr, в SDL свой таймер есть: http://wiki.libsdl.org/CategoryTimer
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
21.10.2013, 17:07  [ТС]     Завершение бесконечного цикла через определенное время #25
Цитата Сообщение от ValeryS Посмотреть сообщение
нет
когда он "заканчивается" вызывается событие WM_TIMER, обрабатывай его
Обрабатывать так?
C++
1
2
3
4
KillTimer(NULL, 1);
SetTimer(NULL, 1, 5000, NULL);
if (WM_TIMER == 1)
    timeToDisplayBeaverInSeconds /= 2;
И почему-то дескриптор можно установить только в 0, либо NULL, в других случаях компилятор ошибку выдает
ValeryS
Модератор
6374 / 4840 / 442
Регистрация: 14.02.2011
Сообщений: 16,043
21.10.2013, 17:10     Завершение бесконечного цикла через определенное время #26
Цитата Сообщение от dimakozyr Посмотреть сообщение
Обрабатывать так?
нет
Цитата Сообщение от dimakozyr Посмотреть сообщение
И почему-то дескриптор можно установить только в 0, либо NULL,
покажи свой код
как окно создаешь?
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
21.10.2013, 17:16  [ТС]     Завершение бесконечного цикла через определенное время #27
Цитата Сообщение от ValeryS Посмотреть сообщение
покажи свой код
как окно создаешь?
Вот так:
C++
1
2
3
4
5
6
7
8
9
10
#include "SDL.h"
struct C_InitSurfaces {
    inline void initScreen()
                { screen = SDL_SetVideoMode(960, 640, 32, SDL_SWSURFACE); }
 
    inline SDL_Surface* getScreen() const
        { return screen; }
  private:
      SDL_Surface* screen;
};
ValeryS
Модератор
6374 / 4840 / 442
Регистрация: 14.02.2011
Сообщений: 16,043
21.10.2013, 17:25     Завершение бесконечного цикла через определенное время #28
Так у тебя SDL
я то про ВинАпи
а здесь не силен
alsav22, тебе скинул ссылку про таймер
Цитата Сообщение от alsav22 Посмотреть сообщение
dimakozyr, в SDL свой таймер есть: http://wiki.libsdl.org/CategoryTimer
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
21.10.2013, 18:50  [ТС]     Завершение бесконечного цикла через определенное время #29
Цитата Сообщение от ValeryS Посмотреть сообщение
Так у тебя SDL
я то про ВинАпи
а здесь не силен
alsav22, тебе скинул ссылку про таймер
Аа, я думал, этот способ подойдет, он мне показался попроще.
Ладно, буду разбираться с SDL

Добавлено через 1 час 23 минуты
Руководствовался данным туториалом: http://wiki.libsdl.org/SDL_AddTimer
И вот что получилось:

C++
1
2
3
4
5
6
Uint32 callback(Uint32 interval, void *param) { // Пишет, что нужно точку с запятой поставить
    timeToDisplayBeaverInSeconds /= 2;
    return(interval);
}
 
SDL_TimerID timer60Seconds = SDL_AddTimer(60000, callback, param);
В туториале сказано, что функция callback должна иметь вид:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Uint32 my_callbackfunc(Uint32 interval, void *param) {
    SDL_Event event;
    SDL_UserEvent userevent;
 
    userevent.type = SDL_USEREVENT;
    userevent.code = 0;
    userevent.data1 = NULL;
    userevent.data2 = NULL;
 
    event.type = SDL_USEREVENT;
    event.user = userevent;
 
    SDL_PushEvent(&event);
    return(interval);
}
Она обязательно должна иметь такой вид, или достаточно сделать как у меня?
Мне нужно, чтобы выполнялось всего одно действие - деление на 2
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2013, 19:16     Завершение бесконечного цикла через определенное время #30
Цитата Сообщение от dimakozyr Посмотреть сообщение
Она обязательно должна иметь такой вид, или достаточно сделать как у меня?
Достаточно.
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
21.10.2013, 20:27  [ТС]     Завершение бесконечного цикла через определенное время #31
Почему-то получается, что таймер мгновенно начинается и заканчивается,
какое-бы значение в миллисекундах не было указано

C++
1
2
3
4
5
6
7
8
SDL_NewTimerCallback C_SceneElements::callback() {
    timeToDisplayBeaverInSeconds /= 2;
    return 0;
}
 
void someFunction() {
    SDL_TimerID timer60Seconds = SDL_AddTimer(5000, callback(), NULL);
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2013, 20:38     Завершение бесконечного цикла через определенное время #32
У вас это компилируется?
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
21.10.2013, 20:39  [ТС]     Завершение бесконечного цикла через определенное время #33
Цитата Сообщение от alsav22 Посмотреть сообщение
У вас это компилируется?
Да. Я понимаю, что это неправильно, но уже перепробовал много вариантов
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2013, 20:50     Завершение бесконечного цикла через определенное время #34
Цитата Сообщение от dimakozyr Посмотреть сообщение
Да.
Странно...

Добавлено через 2 минуты
callback() должна возвращать интервал, а не SDL_NewTimerCallback, и принимать два параметра.

Добавлено через 1 минуту
У SDL_AddTimer() второй параметр не должен быть вызовом функции.

Добавлено через 4 минуты
Вот прототип callback:
C++
1
Uint32 my_callbackfunc(Uint32 interval, void *param);
Вот прототип SDL_AddTimer:
C++
1
SDL_TimerID SDL_AddTimer(Uint32 interval, SDL_TimerCallback callback, void* param);
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
21.10.2013, 21:44  [ТС]     Завершение бесконечного цикла через определенное время #35
Я так уже тоже делал, сейчас таймер имеет вид:
C++
1
2
3
4
5
6
7
8
Uint32 C_SceneElements::callback(Uint32 interval, void *param) {
    timeToDisplayBeaverInSeconds /= 2;
    return interval;
}
 
void someFunction() {
    SDL_TimerID SDL_AddTimer(Uint32 interval, SDL_TimerCallback callback, void* param);
}
Теперь SDL_AddTimer нужно как-то вызвать?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2013, 22:00     Завершение бесконечного цикла через определенное время #36
Компилируется?
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
21.10.2013, 22:02  [ТС]     Завершение бесконечного цикла через определенное время #37
Цитата Сообщение от alsav22 Посмотреть сообщение
Компилируется?
Да, но эффекта никакого
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2013, 22:04     Завершение бесконечного цикла через определенное время #38
Цитата Сообщение от dimakozyr Посмотреть сообщение
Да, но эффекта никакого
А код, из 31 поста, тоже компилировался?
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
21.10.2013, 22:05  [ТС]     Завершение бесконечного цикла через определенное время #39
Цитата Сообщение от alsav22 Посмотреть сообщение
А код, из 31 поста, тоже компилировался?
Тоже
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.10.2013, 22:20     Завершение бесконечного цикла через определенное время
Еще ссылки по теме:

Как сделать обновление текста строки через определенное время? C++
C++ Изменить значение переменной через определенное время
Отладка бесконечного цикла C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2013, 22:20     Завершение бесконечного цикла через определенное время #40
Проект выложите.
Yandex
Объявления
21.10.2013, 22:20     Завершение бесконечного цикла через определенное время
Ответ Создать тему
Опции темы

Текущее время: 17:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru