8 / 8 / 2
Регистрация: 14.01.2013
Сообщений: 141

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

06.01.2014, 00:14. Показов 4950. Ответов 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
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 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
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru