Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Антон219
0 / 0 / 5
Регистрация: 09.06.2013
Сообщений: 72
#1

Что использовать вместо таймера для множества точек, жизнь которых - 5 секунд - C++

25.06.2014, 23:32. Просмотров 342. Ответов 4
Метки нет (Все метки)

Привет, народ, подскажите пожалуйста, как принято поступать в следующем случае:
Имеется много разных объектов, они умеют делать много вещей - двигаться, появляться и исчезать с определенной частотой и др. вещи, зависящие от таймера. Как такое реализовать?
Пример: каждый раз при нажатии кнопки на клавиатуре - в форме появляется точка. Каждая точка живет, допустим, 5 секунд, а затем исчезает. Не буду же я для каждой точки свой таймер создавать?! Это и невозможно, там ведь ограничено число таймеров. Интересен именно наиболее принятый способ, сам я могу предложить нечто такое:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SetTimer(hwnd, 1, 1000, NULL);
..........................................
switch(msg)
    {   
case WM_KEYDOWN:
        MyPoint* P = new MyPoint;
        MyVector.push_back(P);
        break;
case WM_TIMER:
        for (int i = 0; i < MyVector.size(); i++)
             {
                   P->counter += 1;
                   if(P->counter >= 5)
                   {
                         delete MyVector[i];
                         MyVector.erase(MyVector.begin() + i);
                   }
             }
        break;
Может и ошибся где, но суть, думаю передал. Так делают?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.06.2014, 23:32
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Что использовать вместо таймера для множества точек, жизнь которых - 5 секунд (C++):

Верно ли, что для любой пары точек из множества все оставшиеся точки лежат по одну сторону от прямой, проведённой через эту пару
Даны действительные числа x1,....x15, y1,....y15, которые рассматриваются как...

Из множества точек на плоскости найти точки, образующие параллелограмм с наибольшим количеством точек внутри
&quot;Даны N точек на плоскости. Найти среди них точки являющиеся вершинами фигуры,...

Выбрать из точек множества три таких, чтобы в получившийся треугольник влезо наибольшее количество точек
Помогите пожалуйста....Дана задача: Из заданного множества точек на плоскости...

Рекурсия вместо трёх циклов for для генерирования точек внутри сферы
нужно переделать код. Вместо 3 циклов использовать рекурсию. /* * File: ...

Изменить способ выделения памяти для массива (вместо new использовать malloc)
#include &quot;stdafx.h&quot; #include &quot;stdlib.h&quot; struct str_Team{ char Komanda;...

Какой массив использовать для хранения множества точек
В общем задача у меня такая: надо нарисовать персонажа из точек и прямых...

4
nmcf
6237 / 5549 / 2524
Регистрация: 14.04.2014
Сообщений: 23,331
26.06.2014, 07:59 #2
В строках 12-13 как ты без вектора обращаешься к P?
1
zss
Модератор
Эксперт С++
6950 / 6512 / 4133
Регистрация: 18.12.2011
Сообщений: 17,175
Завершенные тесты: 1
26.06.2014, 08:06 #3
Лучший ответ Сообщение было отмечено Антон219 как решение

Решение

Идея правильная.
Таймера достаточно одного.
А в цикле Вы проходите по всем созданным объектам
и по каким-то признакам определяете, что с ними делать.
1
dzrkot
zzzZZZ...
523 / 354 / 94
Регистрация: 11.09.2013
Сообщений: 2,039
26.06.2014, 11:23 #4
ну я так же делаю - 1 таймер, в нём итерируем все счётчики, при создании объекта выставляем счетчик в 0, при достижении 5000 объект удаляем
1
Антон219
0 / 0 / 5
Регистрация: 09.06.2013
Сообщений: 72
26.06.2014, 17:03  [ТС] #5
Спасибо! Мне ничего другого в голову не пришло, поэтому я подозревал, что так и должно быть))

nmcf, да, согласен - ошибся, я такие вещи порой только при компиляции обнаруживаю) тогда будет как-то так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SetTimer(hwnd, 1, 1000, NULL);
..........................................
switch(msg)
    {   
case WM_KEYDOWN:
        MyPoint* P = new MyPoint;
        MyVector.push_back(P);
        break;
case WM_TIMER:
        for (int i = 0; i < MyVector.size(); i++)
             {
                   MyVector[i]->counter += 1;
                   if(MyVector[i]->counter >= 5)
                   {
                         delete MyVector[i];
                         MyVector.erase(MyVector.begin() + i);
                   }
             }
        break;
0
26.06.2014, 17:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.06.2014, 17:03
Привет! Вот еще темы с решениями:

Что использовать вместо system, для Ubuntu?
Добрый вечер господа. Я передаю команды в консоль в среде windows словом...

Что использовать вместо GetWindowRect для максимизированных окон?
Есть функция (многие из читающих этот раздел наверняка с ней знакомы)...

Что можно использовать для верстки дизайна сайта вместо css?
Как написать сайт не используя css? Что можно использовать для верстки дизайна...

Что использовать вместо dataGridView для более воспринимаемого и сгруппированного вывода данных из БД
Создаю приложение. Ввод данных (пока на windows form, вводятся в textBox-ы -...


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

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

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