IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Ракета и Цель., Хаос происходящий в потоках. c++/minGW
сообщение
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 222
Пол: Мужской
Реальное имя: Andrew

Репутация: -  0  +


Есть желание написать программу, реализующую действия ракеты и её цели. Задаются координаты цели для ракеты, стрелками на клавиатуре можно менять положение цели в 2-х мерном пространстве, ракета должна отслеживать цель. Все это должно производиться "параллельно"..

Код исходный большой(т.е там файлов листинга просто много). Я знаю, что один вольво отвечает на мои безумные посты, на него и надежда вся.smile.gif
В общем, в коде я оставил комментарии, где происходит "неконтролируемое", они в 2х файлах main и realiz.cpp. Код в архиве...

Сообщение отредактировано: Andrewshkovskii -


Прикрепленные файлы
Прикрепленный файл  ev.zip ( 3.04 килобайт ) Кол-во скачиваний: 200
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Смотри... Я ничего не менял в файлах Rocket.cpp и Target.cpp... Вот все изменения, которые я сделал:

1) файл func.h добавлены описания:
extern char key;
extern bool IsAlive;

extern HANDLE changeKeyEvent;
extern HANDLE startEvent;
, все эти переменные определены в main.cpp

2) файл func.cpp полностью:
#include "func.h"

bool ChangeCoordTarget(Target &tr)
{
WaitForSingleObject(startEvent, INFINITE);
SetEvent(startEvent);
while(IsAlive) {
WaitForSingleObject(changeKeyEvent, INFINITE);
if(key != 0) {
// ResetEvent(changeCoordEvent);
cout << (int)key << endl;
switch (key) {
case 72: // up
tr.y++;
std::cout << "\nY now : " << tr.y << '\n';
break;
case 80: //down
tr.y--;
std::cout << "\nY now : " << tr.y << '\n';
break;
case 75: //left
tr.x--;
std::cout << "\nX now : " << tr.x << '\n';
break;
case 77: // right
tr.x++;
std::cout << "\nX now : " << tr.x << '\n';
break;
}
// SetEvent(changeCoordEvent);
key = 0;
}
Sleep(10);
}
return true;
}


bool MoveToTarget(pointers& p)
{
WaitForSingleObject(startEvent, INFINITE);
SetEvent(startEvent);
while(IsAlive) {
p.rocp->GetRealTimeTCoord(p.tarp);
if (p.rocp->x != p.tarp->x)
if (p.tarp->x < 0) p.rocp->x--;
else p.rocp->x++;

if (p.rocp->y != p.tarp->y)
if (p.tarp->y < 0) p.rocp->y--;
else p.rocp->y++;

cout << "Missile: " << p.rocp->x << " ," << p.rocp->y << endl;
Sleep (1000); // <--- Изменить, а то не совсем честно получается - ракета медленно летит
p.rocp->Hit(p.tarp->TStatus);
if(!p.tarp->TStatus) {
IsAlive = false;
}
}
return true;
}


3) основной цикл файла main.cpp (после согласия выпустить ракету):
		rocket.LockTarget(target.GetXCoord(), target.GetYCoord());
startEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

changeKeyEvent = CreateEvent(NULL, TRUE, TRUE, NULL);

TH2 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ChangeCoordTarget,
&target, 0, &ID); // поток обработки изменения координаты цели
TH = CreateThread(NULL,0, (LPTHREAD_START_ROUTINE) MoveToTarget,
&p, 0, &ID); // ракета постоянно контролирует положение цели и стремится к ней.

SetEvent(startEvent);
int ch;
while(kbhit()) getch();

while(IsAlive) {
if(kbhit()) {
if((ch = getch()) == 224) { // Откуда взялось 224 - не понял, всегда был 0
ResetEvent(changeKeyEvent);
key = getch();
SetEvent(changeKeyEvent);
}
else {
if(ch == 27) {
IsAlive = false;
}
}
}
Sleep(50);
}
} // switch(choise)
Если нужны комментарии - скажи, я суть позже добавлю.
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Andrewshkovskii   Ракета и Цель.   18.12.2008 21:33
Andrewshkovskii   с одной проблемой в case разобрался. совсем забыл …   18.12.2008 22:00
volvo   А можно объяснить, что ты задумывал сделать вот ту…   18.12.2008 22:32
Andrewshkovskii   switch (choise) { case 'n':// если ответ…   18.12.2008 22:45
Andrewshkovskii   Одну проблему нашел, где вычисляется соотношение к…   18.12.2008 23:35
volvo   Задумка неплохая, НО... Объясни мне, зачем у тебя …   19.12.2008 0:12
Andrewshkovskii   Честно говоря не совсем. НЕ совсем я понимаю в син…   19.12.2008 0:19
volvo   Смотри... Я ничего не менял в файлах Rocket.cpp и …   19.12.2008 2:01
Andrewshkovskii   ну интересуют все закомментированные инструкции, в…   19.12.2008 3:24
volvo   Нет-нет... Это как раз для того, чтобы показать те…   19.12.2008 3:56
Andrewshkovskii   я сделал такое лицо сейчас - :dry: У меня лишь п…   19.12.2008 4:08
volvo   вот сейчас тупо вставил твой код, попробывал …   19.12.2008 4:21
Andrewshkovskii   Volvo, скажу одно - тебе можно только позавидовать…   19.12.2008 4:24
volvo   Если убрать SetEvent в ChangeCoordTarget, то поток…   19.12.2008 5:12
Andrewshkovskii   про аски-код - не заметил, извиняюсь. Странно, но …   19.12.2008 5:22
volvo   Кстати, чтобы ракета наводилась на цель, достаточн…   19.12.2008 5:25
Andrewshkovskii   Про вывод из потоков понятно.НО проблема-то не в в…   19.12.2008 5:30
volvo   Мой вариант функции слежения тоже работает стабиль…   19.12.2008 5:36
Andrewshkovskii   Missile at : 8 ,-8 missile report: target at 15278…   19.12.2008 5:45


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 2.05.2024 6:11
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name