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

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

17.10.2013, 19:37. Показов 7666. Ответов 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,876
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,876
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,876
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,876
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
Ответ Создать тему
Новые блоги и статьи
Запрет дублирования строк в табличной части
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: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru