Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.08.2011, 20:51   #11
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Цитата:
Сообщение от _-Re@l-_ Посмотреть сообщение
Так я ж сказал, что это псевдокод, т.е. просто обобщённый алгоритм.
Тогда приношу извинения. Не заметил.
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 05.08.2011, 22:12   #12
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Почитав это и вот это я, с гуглом-транслейтером, и моим средним уровнем языка уяснил следующее:

1) Таймеры - хитрожопый секундомер, который связан с системным временем и окном, которое его вызвало с уникальным идентификатором.
2) После своего завершения, таймер кидает сообщение типа WM_TIMER к очередь сообщений и оттуда его уже можно обрабатывать (правда как к этой очереди обратится я не понял). Или же можно явно указать функцию-обработчик типа VOID CALLBACK , к которой и обратится таймер после своего завершения.

3) Из всего вышесказанного, я решил набросать эскиз вот такого вот алгоритмика: Изначально пишется, что мол у вас есть 2 минуты чтобы сделать что-то. Каждые 10 секунд вас будут извещать об уменьшении данного времени.

Код:
#include <windows.h> //как я понял тут лежат таймеры
#include <iostream>

. . .

HWND hwnd; //декриптор окна. Что такое дескриптор?
                  //подойдет ли он для консольного окна?
VOID CALLBACK TimerMsgControl(        //функция обработки таймеров
                            HWND hwnd,
                            UINT message,  //что за сообщение такое?
                            UINT idTimer,
                            DWORD dwTime) //хотелось бы узнать почему тип DWORD
                  {
                          switch(idTimer){
                           case IDT_TIMER1 : { static int count = 1;
                                                      cout << "Прошло " << count*10 << "cекунд\n";
                                                      count++;
                                                      SetTimer(  //установка 10-ти секундного таймера заново.
                                                                   hwnd,
                                                                   IDT_TIMER1,
                                                                   10000,
                                                                   TimerMsgControl);
                                                       }; break;
                           case IDT_TIMER2 : { cout << "Ваше время истекло" << endl;
                                                        system("PAUSE");
                                                        KillTimer(hwnd,IDT_TIMER2);
                                                        KillTimer(hwnd,IDT_TIMER1);
                                                        exit(1);
                                                      }
                       }
                   }
int main()  //начало программы
{
     SetTimer(hwnd,IDT_TIMER1,10000,TimerMsgControl); //первый таймер
     SetTimer(hwnd,IDT_TIMER2,120001,TimerMsgControl); //второй таймер
     while(1)
     {
     /*выполнение чего либо*/   
     }
}
Верно ли я всё понял?

P.S. - добавил спустя полчаса.

Видимо нихрена я не понял Ибо не работает вся эт хрень Но на удивление мне, ибо не копипастил, а писал сам, эта хрень несмотря на то что не работает, она всё ж таки компилится)
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.

Последний раз редактировалось MooNDeaR; 06.08.2011 в 01:27.
MooNDeaR вне форума Ответить с цитированием
Старый 06.08.2011, 01:44   #13
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Блиииииииннн Если мои знания английского меня не подводят, то я так и не понял, как инициализировать дескриптор типа HWND. Есть 2 функции CreateWindow и CreateWindowEx. Но ни то не другое не может создать мне консольку? Или может? Тогда какие параметры? SetTimer я так понял без инициализированного параметра hwnd я так понял не работает. Я что-то совсем запутался HELP ребятки
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 06.08.2011, 08:54   #14
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
1) Таймеры - хитрожопый секундомер
Так и есть.
Цитата:
Блиииииииннн Если мои знания английского меня не подводят, то я так и не понял, как инициализировать дескриптор типа HWND. Есть 2 функции CreateWindow и CreateWindowEx. Но ни то не другое не может создать мне консольку? Или может? Тогда какие параметры? SetTimer я так понял без инициализированного параметра hwnd я так понял не работает. Я что-то совсем запутался HELP ребятки
Эээээм. Не. Есть же невизуальный компонент Timer в Visual Studio. Зачем вам ручками-то всё прописывать?
_-Re@l-_ вне форума Ответить с цитированием
Старый 06.08.2011, 11:35   #15
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Есть же невизуальный компонент Timer в Visual Studio.
вы уверены что ТС использует CLR или MFC?

ТС, параметр HWND вам скорее всего не нужен, у вас же нет окна?
значит передаете 0 вместо него, и уже тогда(только тогда когда HWND==0) указываете процедуру.
и не забудьте про цикл сообщений, без него не заработает таймер.

кстати для безоконных таймеров второй параметр игнорируется, и вы чтоб потом удалить таймер, должны запомнить значение которое вернет функция.

Код:
#include <windows.h> //как я понял тут лежат таймеры
#include <iostream>

. . .

UINT_PTR IDT_TIMER1,IDT_TIMER2; 

VOID CALLBACK TimerMsgControl(       
                            HWND hwnd,
                            UINT message,  
                            UINT_PTR idTimer,
                            DWORD dwTime) 
                  {
                          switch(idTimer){
                           case IDT_TIMER1 : { static int count = 1;
                                                      cout << "Прошло " << count*10 << "cекунд\n";
                                                      count++;
                                                      break;
                           case IDT_TIMER2 : { cout << "Ваше время истекло" << endl;
                                                        system("PAUSE");
                                                        KillTimer(0,IDT_TIMER2);
                                                        KillTimer(0,IDT_TIMER1);
                                                        exit(1);
                                                      }
                       }
                   }
int main()  //начало программы
{
     IDT_TIMER1=SetTimer(hwnd,0,10000,TimerMsgControl); //первый таймер
     IDT_TIMER2=SetTimer(hwnd,0,120001,TimerMsgControl); //второй таймер
     MSG m;
     while(GetMessage(&m,0,0,0))
     {
          DispatchMessage(&m); 
     }
}
вроде примерно так, с таймерами есть один напряг что перейдя на таймер, по сути через него работать и будете теперь.

Цитата:
//установка 10-ти секундного таймера заново
не нужно.
Цитата:
//что за сообщение такое?
в данном случае это вам не важно.
Цитата:
//хотелось бы узнать почему тип DWORD
потому что число целое
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 06.08.2011 в 11:46.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.08.2011, 13:49   #16
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Спасибо за ответы. Только из написанного меня смущает вот это:

Код:
IDT_TIMER1=SetTimer(hwnd,0,10000,TimerMsgControl); //первый таймер
Просто hwnd нигде не описан? Или мне всё-таки там ноль писать?

Цитата:
потому что число целое
Это понятно. Непонятно почему системное время (вероятней всего в секундах) запивывают в тип, для которого может не хватить разрядов?

Цитата:
не нужно
Т.е. таймер сам перезагружается?

И хотелось бы чуть-чуть по подробнее узнать работу вот этой конструкции

Код:
 while(GetMessage(&m,0,0,0))
     {
          DispatchMessage(&m); 
     }
Тут, как я понял идет получение сообщения из очереди сообщений, и возвращается ненулевое значение если не пришел сигнал WM_QIUT? Получается цикл вечный?

и еще вот этой

Код:
 switch(idTimer){
                           case IDT_TIMER1 : { static int count = 1;
                                                      cout << "Прошло " << count*10 << "cекунд\n";
                                                      count++;
                                                      break;
                           case IDT_TIMER2 : { cout << "Ваше время истекло" << endl;
                                                        system("PAUSE");
                                                        KillTimer(0,IDT_TIMER2);
                                                        KillTimer(0,IDT_TIMER1);
                                                        exit(1);
                                                      }
idTimer, если игнорируется, то Switch матюкается по поводу того, что IDT_TIMER1 и IDT_TIMER2 - это не константы
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.

Последний раз редактировалось MooNDeaR; 06.08.2011 в 14:20.
MooNDeaR вне форума Ответить с цитированием
Старый 06.08.2011, 14:26   #17
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

MooNDeaR, если вы не пользуете WinForms, то тогда лучше налягьте на Win API, а то вот вроде игру делаете, а основ не знаете.

А , и ещё
Цитата:
Непонятно почему системное время (вероятней всего в секундах) запивывают в тип, для которого может не хватить разрядов?
2^32-1 уже недостаточно?
_-Re@l-_ вне форума Ответить с цитированием
Старый 06.08.2011, 14:35   #18
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Просто hwnd нигде не описан? Или мне всё-таки там ноль писать?
ноль, я просто правя ваш код забыл поставить 0.
Цитата:
Это понятно. Непонятно почему системное время (вероятней всего в секундах) запивывают в тип, для которого может не хватить разрядов?
для GetTickCount хватает 32-ух разрядов.(а это же и возвращается в том параметре)
Цитата:
Т.е. таймер сам перезагружается?
о не перегружает, он просто работает пока не выключите, одноразовый это WaitableTimer.
Цитата:
Тут, как я понял идет получение сообщения из очереди сообщений, и возвращается ненулевое значение если не пришел сигнал WM_QIUT? Получается цикл вечный?
у вас во втором таймере выход из приложения, так что не вечный

повторю свои слова
Цитата:
с таймерами есть один напряг что перейдя на таймер, по сути через него работать и будете теперь.
Цитата:
idTimer, если игнорируется, то Switch матюкается по поводу того, что IDT_TIMER1 и IDT_TIMER2 - это не константы
не учел, там if else надо тогда ставить, а вообще можно легко ваши таймеры объединить в один.(счетчик завести)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.08.2011, 14:48   #19
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Цитата:
MooNDeaR, если вы не пользуете WinForms, то тогда лучше налягьте на Win API, а то вот вроде игру делаете, а основ не знаете.
Знал бы, вероятно бы не создавал тему А если учесть, что учить меня некому и на MSDN вроде всё и понятно, да только всё ссылается друг на друга, всё соеденить в моей голове, которая впервые это читает, довольно сложно. А так как учить меня некому, учебников нет и знающих знакомых тоже, вот тут и постю.

Цитата:
не учел, там if else надо тогда ставить, а вообще можно легко ваши таймеры объединить в один.(счетчик завести)
Счетчик там и так есть В принципе я разобрался уже что к чему. Однако на счет if else непонятно. Ведь ID и без того игнорится, тогда что делатЬ?

Спасибо огромное за помощь, я бы без вас разбирался бы в 4 раза дольше.
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 06.08.2011, 14:50   #20
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ид игнорится в функции SetTimer, в сообщение он приходит, и этот id нам возвращает функция SetTimer(то есть если нет окна то функция нам назначает id).
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача из раздела Комбинаторные алгоритмы и алгоритмы на гра-фах в Паскале Klik_1602 Помощь студентам 1 04.01.2011 01:18
[Вопрос] Реализация многопоточности запуска/остановки конкретных программ из списка Человек_Борща Общие вопросы Delphi 8 06.10.2010 08:59
Численные методы. Метод Стрельбы (Делфи) s1z0n Помощь студентам 1 23.04.2010 15:37
краевая задача диф.уравнения методом стрельбы Laplas Помощь студентам 2 26.12.2009 23:56
Задача на оценку эффективности стрельбы Борзов Помощь студентам 3 23.05.2007 06:54