Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/25: Рейтинг темы: голосов - 25, средняя оценка - 4.88
8 / 8 / 2
Регистрация: 14.01.2013
Сообщений: 141

Как написать свой таймер?

06.01.2014, 00:14. Показов 5000. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Чтобы функция выполнялась скажем каждые 200 миллисекунд. Сейчас WM_TIMER делает это, но он не подходит. Искал по многим запросам в гугле и не смог найти простого примера.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.01.2014, 00:14
Ответы с готовыми решениями:

Как написать свой Браузер на С++
Всем добрый день Недавно прочитал статейку :read: в интернете (не помню на каком сайте точно) что можно самому написать свой браузер....

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

Написать таймер к задаче
Ребят помогите написать таймер к этой задаче: #include <stdio.h> #include <stdlib.h> #include <iostream> #include...

22
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
06.01.2014, 00:32
Цитата Сообщение от mzarb Посмотреть сообщение
Сейчас WM_TIMER делает это, но он не подходит.
Почему?
0
8 / 8 / 2
Регистрация: 14.01.2013
Сообщений: 141
06.01.2014, 00:39  [ТС]
Croessmah, мне так сказали
0
 Аватар для Nikcharn
71 / 53 / 10
Регистрация: 31.07.2009
Сообщений: 149
06.01.2014, 01:45
Цитата Сообщение от mzarb Посмотреть сообщение
мне так сказали
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <ctime> 
using namespace std;
void how2timer(int ms) {
    int CLOCKS_PER_MSEC = CLOCKS_PER_SEC / 1000; 
    clock_t end_time = clock() + ms * CLOCKS_PER_MSEC ;
    while (clock() < end_time) {}
    cout << "Время вышло!!!\n";
}
int main (){
    how2timer(5000);  // 5 секунд
    return 0;
}
1
8 / 8 / 2
Регистрация: 14.01.2013
Сообщений: 141
06.01.2014, 02:23  [ТС]
Nikcharn, ок, а куда это дело вставлять, в WM_CREATE сойдет?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
06.01.2014, 02:31
Цитата Сообщение от mzarb Посмотреть сообщение
а куда это дело вставлять
для начала в голову. Смысл вставлять то, что не понимаете?
2
 Аватар для Nikcharn
71 / 53 / 10
Регистрация: 31.07.2009
Сообщений: 149
06.01.2014, 02:34
Цитата Сообщение от mzarb Посмотреть сообщение
ок, а куда это дело вставлять, в WM_CREATE сойдет?
А можете полнее озвучить вашу задачу?
0
8 / 8 / 2
Регистрация: 14.01.2013
Сообщений: 141
06.01.2014, 02:50  [ТС]
Nikcharn,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
#include "windows.h"
#include <deque>
#include <algorithm>
#include <iostream>
#include <time.h>
 
const int cellCountX = 60;
const int cellCountY = 40;
const int cellSize   = 10;
 
const int windowWidth  = cellSize * cellCountX+7;
const int windowHeight = cellSize * cellCountY+29;
const int clientWidth  = cellSize * cellCountX;
const int clientHeight = cellSize * cellCountY;
 
int snakeSize  = 6;
int snakeLives = 4;
struct snake{
  int x;
  int y;
};
 
std::deque<snake> snakePos;
std::deque<snake> lifePos;
std::deque<snake> foodPos;
 
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
 
int WINAPI WinMain(HINSTANCE h,HINSTANCE hprevinstance,LPSTR lpcmdline,int ncmdshow){
  WNDCLASSEX wc;
  HWND hwnd;
  MSG msg;
 
  ZeroMemory(&msg,sizeof(MSG));
  wc.cbSize=sizeof(wc);
  wc.style=CS_OWNDC|CS_HREDRAW|CS_VREDRAW;
  wc.lpfnWndProc=WndProc;
  wc.cbClsExtra=0;
  wc.cbWndExtra=0;
  wc.hInstance=h;
  wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
  wc.hCursor=LoadCursor(h,IDC_ARROW);
  wc.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);
  wc.lpszMenuName=NULL;
  wc.lpszClassName="main";
  wc.hIconSm=LoadIcon(NULL,IDI_APPLICATION);
  if(!RegisterClassEx(&wc)) return 0;
 
  if(!(hwnd=CreateWindowEx(NULL,"main","Snake",WS_OVERLAPPEDWINDOW^WS_MAXIMIZEBOX^WS_THICKFRAME|WS_VISIBLE,(GetSystemMetrics(SM_CXSCREEN) - windowWidth) / 2, (GetSystemMetrics(SM_CYSCREEN) - windowHeight-300) / 2,windowWidth,windowHeight,NULL,NULL,h,NULL))) return 0;
  ShowWindow(hwnd,SW_SHOWDEFAULT);
  UpdateWindow(hwnd);
 
  while(msg.message != WM_QUIT){
    if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)){
      TranslateMessage(&msg);
      DispatchMessage(&msg);
    }
  }
  return msg.wParam;
}
 
snake GenFoodPos() {
  int foodPosX;
  int foodPosY;
  snake foodPosTemp;
  srand(clock());
  foodPosX = rand() % cellCountX;
  foodPosY = rand() % cellCountY;
  foodPosTemp.x = foodPosX*cellSize;
  foodPosTemp.y = foodPosY*cellSize;
  return foodPosTemp;
}
 
bool CheckFoodPos(snake foodPos){
  for(std::deque<snake>::iterator it = snakePos.begin(); it!=snakePos.end();++it){
    if(foodPos.x == it->x && foodPos.y == it->y){
      return FALSE;
    }
  }
  return TRUE;
}
 
void SetFoodPos(){
  snake newFoodTemp;
  bool badFoodPos;
  do
  {
    newFoodTemp = GenFoodPos();
    badFoodPos = CheckFoodPos(newFoodTemp);
  } while(!badFoodPos);
  foodPos.push_front(newFoodTemp);
  if(foodPos.size() > 1) foodPos.pop_back();
}
 
bool CheckGettingFood(){
  if(snakePos.front().x == foodPos.front().x && snakePos.front().y == foodPos.front().y){
    SetFoodPos();
    return TRUE;
  }
  return FALSE;
}
 
void OriginSnakePos() {
  for(int i=0; i < snakeSize; i++){
    snake snakePosTemp ={cellSize * ((cellCountX/2)+i),  cellSize * (cellCountY/2)};
    snakePos.push_back(snakePosTemp);
  }
}
 
snake GenLifePos() {
  int lifePosX;
  int lifePosY;
  snake lifePosTemp;
  srand(clock());
  lifePosX = rand() % cellCountX;
  lifePosY = rand() % cellCountY;
  lifePosTemp.x = lifePosX*cellSize;
  lifePosTemp.y = lifePosY*cellSize;
  return lifePosTemp;
}
 
bool CheckLifePos(snake lifePos){
  for(std::deque<snake>::iterator it = snakePos.begin(); it!=snakePos.end();++it){
    if(lifePos.x == it->x && lifePos.y == it->y){
      return FALSE;
    }
  }
  if(lifePos.x == foodPos.front().x && lifePos.y == foodPos.front().y){
    return FALSE;
  }
  return TRUE;
}
 
void SetLifePos(){
  snake newLifeTemp;
  bool badLifePos;
  do
  {
    newLifeTemp = GenLifePos();
    badLifePos = CheckLifePos(newLifeTemp);
  } while(!badLifePos);
  lifePos.push_front(newLifeTemp);
  if(lifePos.size() > 1) lifePos.pop_back();
}
 
bool CheckGettingLife(){
  if(snakePos.front().x == lifePos.front().x && snakePos.front().y == lifePos.front().y){
    SetLifePos();
    ++snakeLives;
    return TRUE;
  }
  return FALSE;
}
 
bool CheckWrongMove(){
  for(std::deque<snake>::iterator it = snakePos.begin()+4; it!=snakePos.end();++it){
    //Проверка на касение головы с хвостом
    if(snakePos.front().x == it->x && snakePos.front().y == it->y){
      return TRUE;
    }
  }
  //Проверка на касание головы со стенами
  if(snakePos.front().x <= -1 || snakePos.front().x >= clientWidth
    || snakePos.front().y >= clientHeight || snakePos.front().y <= -1) {
      return TRUE;
  }
  return FALSE;
}
 
void SnakeMove(int keyPressed, HWND hwnd){
  if(!snakeLives) snakeLives = 4;
  snakePos.push_front(snakePos.front());
  switch(keyPressed){
  case VK_LEFT:
    snakePos.front().x -= cellSize;
    break;
  case VK_UP:
    snakePos.front().y -= cellSize;
    break;
  case VK_RIGHT:
    snakePos.front().x += cellSize;
    break;
  case VK_DOWN:
    snakePos.front().y += cellSize;
    break;
  }
  if(!CheckGettingFood()) snakePos.pop_back();
  if(CheckWrongMove()){
    snakePos.erase(snakePos.begin(),snakePos.end());
    OriginSnakePos();
    --snakeLives;
  }
  InvalidateRect(hwnd, NULL, TRUE);
}
 
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
  HDC hdc;
  PAINTSTRUCT ps;
  HPEN redPen;
  HPEN greenPen;
  HBRUSH hBrush;
  static HWND hwndB;
  static int keyPressed;
  static int keyPrvPres;
  switch (message){
 
  case WM_CREATE:
    keyPressed = VK_LEFT;
    keyPrvPres = VK_LEFT;
    OriginSnakePos();
    SetFoodPos();
    SetTimer(hwnd, 1, 300, NULL);
 
    return 0;
 
  case WM_KEYDOWN:
    switch(wParam){
    case VK_UP:
      if(keyPrvPres != VK_DOWN) keyPressed = VK_UP;
      break;
    case VK_DOWN:
      if(keyPrvPres != VK_UP) keyPressed = VK_DOWN;
      break;
    case VK_LEFT:
      if(keyPrvPres != VK_RIGHT) keyPressed = VK_LEFT;
      break;
    case VK_RIGHT:
      if(keyPrvPres != VK_LEFT) keyPressed = VK_RIGHT;
      break;
    }
    return 0;
 
  case WM_TIMER:
    SnakeMove(keyPressed, hwnd);
    keyPrvPres = keyPressed;
    return 0;
 
  case WM_PAINT:
    hdc = BeginPaint(hwnd, &ps);
    greenPen = CreatePen(PS_SOLID,1,RGB(0,255,0));
    hBrush = CreateSolidBrush(RGB(0,255,0));
    redPen = CreatePen(PS_SOLID,1,RGB(255,0,0));
    SelectObject(hdc, greenPen);
    if(snakeLives){ 
      //Отрисовка змеи
      for(std::deque<snake>::iterator it = snakePos.begin(); it!=snakePos.end(); ++it){
        Rectangle(hdc, it->x+cellSize, it->y+cellSize, it->x, it->y);
      }
 
      //Отрисовка еды
      SelectObject(hdc, redPen);
      Rectangle(hdc, foodPos.back().x+cellSize, foodPos.back().y+cellSize, foodPos.back().x, foodPos.back().y);
      SelectObject(hdc, greenPen);
      //Отрисовка поля
      for(int i=0;i<=clientWidth;i+=cellSize){
        MoveToEx(hdc,i,0,NULL);
        LineTo(hdc,i,clientHeight);
      }
      for(int j=0;j<=clientHeight;j+=cellSize){
        MoveToEx(hdc,0,j,NULL);
        LineTo(hdc,clientWidth,j);
      }
    }
    else {
      KillTimer(hwnd, 1);
      if(MessageBox(hwnd, "\nPress 'OK' to play again", "Game Over", MB_OK|MB_APPLMODAL) == IDOK)
        SetTimer(hwnd, 1, 300, NULL);
    }
    EndPaint(hwnd, &ps);
    return 0;
 
  case WM_DESTROY:
    KillTimer(hwnd, 1);
    PostQuitMessage(0);
    return 0;
  }
  return DefWindowProc(hwnd, message, wParam, lParam);
}
Вот в этом коде заменить WM_TIMER на ваш код. Пробовал не получается.
0
 Аватар для Nikcharn
71 / 53 / 10
Регистрация: 31.07.2009
Сообщений: 149
06.01.2014, 13:39
Цитата Сообщение от mzarb Посмотреть сообщение
Вот в этом коде заменить WM_TIMER на ваш код. Пробовал не получается.
Эм, логично. В начале внимательно посмотрите на мою функцию и поймите что она делает.
0
8 / 8 / 2
Регистрация: 14.01.2013
Сообщений: 141
06.01.2014, 15:05  [ТС]
Nikcharn, и что же она делает?
0
Модератор
Эксперт JS
 Аватар для Eva Rosalene
5241 / 2115 / 416
Регистрация: 06.01.2013
Сообщений: 4,846
06.01.2014, 15:09
mzarb, после вызова происходит задержка на указанное число мс
0
 Аватар для Nikcharn
71 / 53 / 10
Регистрация: 31.07.2009
Сообщений: 149
06.01.2014, 15:11
Цитата Сообщение от mzarb Посмотреть сообщение
Nikcharn, и что же она делает?
Эта функция, через заданное время, например при входных данных 5000 (5 сек), выводит на экран, что время вышло и можно делать следующее действие. Вам же нужно доработать ее. Вместо того чтобы она писала текст, например, вам нужно поставить то действие какое Вы хотите, типа выполнение функции и т.д..
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
06.01.2014, 15:22
mzarb, вы так и не объяснили: чем не устраивает WM_TIMER?
0
8 / 8 / 2
Регистрация: 14.01.2013
Сообщений: 141
06.01.2014, 15:54  [ТС]
alsav22, я же не задавал вопрос о том, что лучше.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
06.01.2014, 15:57
Цитата Сообщение от mzarb Посмотреть сообщение
я же не задавал вопрос о том, что лучше.
И что? Я к тому, что код Nikcharn, совсем не годится для вашего кода.
0
8 / 8 / 2
Регистрация: 14.01.2013
Сообщений: 141
06.01.2014, 16:19  [ТС]
alsav22, я не могу сейчас объяснить толком зачем, потому что хочу менять структуру дальше, а WM_TIMER в неё не вписывается. По этому мне нужен любой таймер, только чтобы он не был связан с WM_TIMER и был по возможности не сильно большой. Ну в играх же какие-то таймеры используют? Мне нужен примерно такой же, только меня не интересует его точность, а просто чтобы был не такой как у меня сейчас, а в виде функции.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
06.01.2014, 16:43
Цитата Сообщение от mzarb Посмотреть сообщение
Ну в играх же какие-то таймеры используют?
Используют. Используют те, которые предоставляет библиотека, с помощью которой игра пишется. У вас код использует WinAPI, значит и таймер нужен такой же (WM_TIMER).
0
8 / 8 / 2
Регистрация: 14.01.2013
Сообщений: 141
06.01.2014, 18:40  [ТС]
alsav22, ясно

Добавлено через 1 час 26 минут
кстати, а толку копипастить? ссылка
Какой смысл на этом форуме себе репутацию клепать? Вон сегодня один школер уже доказал это, когда мне -218 влепил в репу.
0
 Аватар для Nikcharn
71 / 53 / 10
Регистрация: 31.07.2009
Сообщений: 149
06.01.2014, 18:40
Цитата Сообщение от alsav22 Посмотреть сообщение
У вас код использует WinAPI, значит и таймер нужен такой же (WM_TIMER).
Это удобнее просто, но если человек хочет написать свой таймер, кто ему мешает? Это же не для бизнес продукта делается, а для обучения.
0
8 / 8 / 2
Регистрация: 14.01.2013
Сообщений: 141
06.01.2014, 18:43  [ТС]
Nikcharn, +
Эта змейка даже не для вуза. Я мог бы сделать весь функционал за пол часа, но там бы было много быдлокода и костылей, а так хочу что-то более мне нормально сделать и как вы отметили, научится на этом.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.01.2014, 18:43
Помогаю со студенческими работами здесь

Написать свой фасет
Есть задача - написать свой собственный фасет, что бы выводил вместо некоторых цифр их словесное название. Из всех фасетов, что есть в...

Написать свой манипулятор
Здравствуйте, подскажите пожалуйста, как для класса A, написать свой манипулятор, который вызвал бы функцию класса? Чтобы манипулятор мог...

Пытаюсь написать таймер на С++, но линукс против
Приветствую! Соорудил таймер: #include &lt;iostream&gt; #include &lt;ctime&gt; using namespace std;

Можно ли написать свой оператор?
Собственно, весь вопрос в заголовке темы. Вот есть операторы + - == и т.д. Их можно перегружать. А возможно ли создать свой оператор?...

Написать свой движок с нуля
Как написать свой движок с нуля при помощью C++. Заранее спасибо.


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в КА2. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа в КА2. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru