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

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

25.06.2014, 23:32. Просмотров 849. Ответов 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
Ответы с готовыми решениями:

Верно ли, что для любой пары точек из множества все оставшиеся точки лежат по одну сторону от прямой, проведённой через эту пару
Даны действительные числа 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
6274 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
26.06.2014, 07:59 2
В строках 12-13 как ты без вектора обращаешься к P?
1
zss
Модератор
Эксперт С++
7178 / 6677 / 4226
Регистрация: 18.12.2011
Сообщений: 17,622
Завершенные тесты: 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 / 0
Регистрация: 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 для максимизированных окон?
Есть функция (многие из читающих этот раздел наверняка с ней знакомы)...


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

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

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