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

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

17.10.2013, 19:37. Показов 7442. Ответов 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
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
21.10.2013, 12:48
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от 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
383 / 30 / 3
Регистрация: 17.08.2013
Сообщений: 560
21.10.2013, 12:54  [ТС]
Создаю таймер. Когда он заканчивается, то возвращает значение(как я понял):

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
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
21.10.2013, 13:03
Цитата Сообщение от dimakozyr Посмотреть сообщение
Когда он заканчивается, то возвращает значение(как я понял):
нет
когда он "заканчивается" вызывается событие WM_TIMER, обрабатывай его
Цитата Сообщение от dimakozyr Посмотреть сообщение
if(!SetTimer(0, 1, 5000, (TIMERPROC)NULL))
* * timeToDisplayBeaverInSeconds /= 2;
это не слип он не останавливает программу на время

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

Добавлено через 2 минуты
Цитата Сообщение от dimakozyr Посмотреть сообщение
Непонятно, что такое hWnd и разве не должно быть 4 аргумента?
четвертый аргумент это адрес функции, которая вызовется когда сработает таймер
если он NULL то обрабатывается сообщение, я просто его упустил(описался)
Цитата Сообщение от dimakozyr Посмотреть сообщение
что такое hWnd
дескриптор твоего окна
1
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2013, 13:08
dimakozyr, в SDL свой таймер есть: http://wiki.libsdl.org/CategoryTimer
1
 Аватар для dimakozyr
383 / 30 / 3
Регистрация: 17.08.2013
Сообщений: 560
21.10.2013, 17:07  [ТС]
Цитата Сообщение от 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
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
21.10.2013, 17:10
Цитата Сообщение от dimakozyr Посмотреть сообщение
Обрабатывать так?
нет
Цитата Сообщение от dimakozyr Посмотреть сообщение
И почему-то дескриптор можно установить только в 0, либо NULL,
покажи свой код
как окно создаешь?
1
 Аватар для dimakozyr
383 / 30 / 3
Регистрация: 17.08.2013
Сообщений: 560
21.10.2013, 17:16  [ТС]
Цитата Сообщение от 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
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
21.10.2013, 17:25
Так у тебя SDL
я то про ВинАпи
а здесь не силен
alsav22, тебе скинул ссылку про таймер
Цитата Сообщение от alsav22 Посмотреть сообщение
dimakozyr, в SDL свой таймер есть: http://wiki.libsdl.org/CategoryTimer
1
 Аватар для dimakozyr
383 / 30 / 3
Регистрация: 17.08.2013
Сообщений: 560
21.10.2013, 18:50  [ТС]
Цитата Сообщение от 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
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2013, 19:16
Цитата Сообщение от dimakozyr Посмотреть сообщение
Она обязательно должна иметь такой вид, или достаточно сделать как у меня?
Достаточно.
0
 Аватар для dimakozyr
383 / 30 / 3
Регистрация: 17.08.2013
Сообщений: 560
21.10.2013, 20:27  [ТС]
Почему-то получается, что таймер мгновенно начинается и заканчивается,
какое-бы значение в миллисекундах не было указано

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);
}
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2013, 20:38
У вас это компилируется?
1
 Аватар для dimakozyr
383 / 30 / 3
Регистрация: 17.08.2013
Сообщений: 560
21.10.2013, 20:39  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
У вас это компилируется?
Да. Я понимаю, что это неправильно, но уже перепробовал много вариантов
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2013, 20:50
Цитата Сообщение от 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);
1
 Аватар для dimakozyr
383 / 30 / 3
Регистрация: 17.08.2013
Сообщений: 560
21.10.2013, 21:44  [ТС]
Я так уже тоже делал, сейчас таймер имеет вид:
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 нужно как-то вызвать?
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2013, 22:00
Компилируется?
1
 Аватар для dimakozyr
383 / 30 / 3
Регистрация: 17.08.2013
Сообщений: 560
21.10.2013, 22:02  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
Компилируется?
Да, но эффекта никакого
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2013, 22:04
Цитата Сообщение от dimakozyr Посмотреть сообщение
Да, но эффекта никакого
А код, из 31 поста, тоже компилировался?
1
 Аватар для dimakozyr
383 / 30 / 3
Регистрация: 17.08.2013
Сообщений: 560
21.10.2013, 22:05  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
А код, из 31 поста, тоже компилировался?
Тоже
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2013, 22:20
Проект выложите.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.10.2013, 22:20

Нет ответа на команды во время выполнения бесконечного цикла
Здравствуйте. Такая проблема. Есть код мини игры, если её можно так назвать, в которой после "покупки" некой вещи к значению...

Как можно прервать выполнение цикла на определенное время?
<? $y=0; for ($i=0; $i<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

Загрузка через определённое время
Многие видели на сайтах есть загрузка файла через опеределённое времмя .. у кого есть исходник ? глянуть хочу . или дайте ссылку почитать .


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса Калибровка параметров симбиотической модели: технический обзор Содержание: Введение Постановка проблемы Технические аспекты реализации Процесс внедрения изменений
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru