Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.84
dimakozyr
158 / 25 / 1
Регистрация: 17.08.2013
Сообщений: 467
#1

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

17.10.2013, 19:37. Просмотров 2686. Ответов 62
Метки нет (Все метки)

Есть бесконечный цикл for( ; ; ), который обрабатывает событие нажатия кнопки в игре.
Если на кнопку не нажали в течении двух секунд, нужно, чтобы цикл завершался, как это можно сделать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.10.2013, 19:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Завершение бесконечного цикла через определенное время (C++):

Очистка экрана в консоли через определенное время - C++
Результат стоит в консоли секунду потом происходит очистка экрана. как такое можно реализовать??

Изменить значение переменной через определенное время - C++
Всем доброго времени суток. Допустим есть значение a=10; Надо его изменить на a=15 и что бы оно так держалось допустим в течени часа,...

На какой отметке остановится мотоциклист через определенное время? - C++
Длина Московской кольцевой автомобильной дороги —109 километров. Байкер Вася стартует с нулевого километра МКАД и едет со скоростью...

Как сделать обновление текста строки через определенное время? - C++
Здравствуйте. Как сделать обновление текста строки через определенное время? #include <iostream> #include <string> #include...

Открыть и закрыть файл exe через определенное время - C++
Извините за тупой вопрос. Мне нужно просто открыть экзешник и со временем,например 5 секунд,чтобы сам просто закрылся. То есть просто...

Помогите решить задачу(Гражданин открыл счет в банке. Определить прирост и сумму вклада через определенное время) - C++
Помогите решить задачи через цикл do _ while: 2) Гражданин 1 марта открыл счет в банке вложив 1000 руб. Через каждый месяц размер...

62
dimakozyr
158 / 25 / 1
Регистрация: 17.08.2013
Сообщений: 467
21.10.2013, 12:02  [ТС] #16
Цитата Сообщение от alsav22 Посмотреть сообщение
А, да, у меня внутри цикла обработка событий.
Но вот не пойму, почему отсчет времени останавливается, если курсором не шевелить
События есть внутри цикла, с этим уже разобрался, вопрос-же не об этом

Цитата Сообщение от ValeryS Посмотреть сообщение
Для начала программа какая?
консольная?
тогда совет с kbhit()!=0 подойдет
оконная?
тогда забыть цикл как страшный сон и работать с таймером SetTimer\ KillTimer
и обрабатывать событие WM_TIMER
Оконная. Сейчас попробую, а почему цикл нужно забыть?
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2013, 12:04 #17
Цитата Сообщение от dimakozyr Посмотреть сообщение
События есть внутри цикла,
Какие, если не двигать мышь и не нажимать на клавиши и кнопки мыши?
1
dimakozyr
158 / 25 / 1
Регистрация: 17.08.2013
Сообщений: 467
21.10.2013, 12:05  [ТС] #18
Цитата Сообщение от alsav22 Посмотреть сообщение
Какие, если не двигать мышь и не нажимать на клавиши и кнопки мыши?
На экране рандомом появляется бобер в разных местах.
Если на него не нажать за 2 секунды, то он исчезает и появляется в другом месте.
0
SatanaXIII
21.10.2013, 12:23
  #19

Не по теме:

dimakozyr, это получается событие "бобер" передается операционной системе, которая знает что с ним делать? Операционная система сидит такая и думает: "пошевелилась мышка. Ага, надо значит перерисовать курсор. Так. Нажалась кнопка мышки. Значит проверю ка я что находится под ней и перешлю этому приложению это событие. Так-с, появился бобер. Надо случайно отрисовать его где-нибудь..."

0
dimakozyr
158 / 25 / 1
Регистрация: 17.08.2013
Сообщений: 467
21.10.2013, 12:33  [ТС] #20
Цитата Сообщение от SatanaXIII Посмотреть сообщение
dimakozyr, это получается событие "бобер" передается операционной системе, которая знает что с ним делать? Операционная система сидит такая и думает: "пошевелилась мышка. Ага, надо значит перерисовать курсор. Так. Нажалась кнопка мышки. Значит проверю ка я что находится под ней и перешлю этому приложению это событие. Так-с, появился бобер. Надо случайно отрисовать его где-нибудь..."
Да, все так и есть

Добавлено через 24 секунды
Но от этого не легче..
0
ValeryS
Модератор
6707 / 5116 / 482
Регистрация: 14.02.2011
Сообщений: 17,189
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 секунды
}
1
dimakozyr
158 / 25 / 1
Регистрация: 17.08.2013
Сообщений: 467
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 аргумента?
Компилятор выдает ошибку, если только три указать
0
ValeryS
Модератор
6707 / 5116 / 482
Регистрация: 14.02.2011
Сообщений: 17,189
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
дескриптор твоего окна
1
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2013, 13:08 #24
dimakozyr, в SDL свой таймер есть: http://wiki.libsdl.org/CategoryTimer
1
dimakozyr
158 / 25 / 1
Регистрация: 17.08.2013
Сообщений: 467
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, в других случаях компилятор ошибку выдает
0
ValeryS
Модератор
6707 / 5116 / 482
Регистрация: 14.02.2011
Сообщений: 17,189
21.10.2013, 17:10 #26
Цитата Сообщение от dimakozyr Посмотреть сообщение
Обрабатывать так?
нет
Цитата Сообщение от dimakozyr Посмотреть сообщение
И почему-то дескриптор можно установить только в 0, либо NULL,
покажи свой код
как окно создаешь?
1
dimakozyr
158 / 25 / 1
Регистрация: 17.08.2013
Сообщений: 467
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;
};
0
ValeryS
Модератор
6707 / 5116 / 482
Регистрация: 14.02.2011
Сообщений: 17,189
21.10.2013, 17:25 #28
Так у тебя SDL
я то про ВинАпи
а здесь не силен
alsav22, тебе скинул ссылку про таймер
Цитата Сообщение от alsav22 Посмотреть сообщение
dimakozyr, в SDL свой таймер есть: http://wiki.libsdl.org/CategoryTimer
1
dimakozyr
158 / 25 / 1
Регистрация: 17.08.2013
Сообщений: 467
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
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2013, 19:16 #30
Цитата Сообщение от dimakozyr Посмотреть сообщение
Она обязательно должна иметь такой вид, или достаточно сделать как у меня?
Достаточно.
0
21.10.2013, 19:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.10.2013, 19:16
Привет! Вот еще темы с ответами:

Досрочное завершение цикла for - C++
for (int i = 0; i < n; i++) { cin >> names >> scores; } // прекратить ввод введение строки No More если даже i не достиг...

Отладка бесконечного цикла - C++
Здравствуйте. Проблема такая, написал цикл программы взаимодействия пользователя с меню Цикл не имеет условия выхода, что бы выйти...

Условие завершение цикла с использованием структуры - C++
Доброе время суток! Я новичок на этом форуме и если че не так не ругайтесь. У меня такой вопрос как задать условие выхода из цикла....

Завершение цикла при вводе EOF - C++
Пишу небольшую программку и в ней имеется вот такой код: typedef std::istream_iterator<std::string> string_input; for...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru