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

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

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.09.2011, 08:24   #1
nikitinign
 
Регистрация: 30.08.2011
Сообщений: 8
По умолчанию многопоточные приложения

Здравствуйте. При первых попытках сделать ИИ наткнулся на проблему одновременного выполнения операций - в одно и то же время перемещаться может только один персонаж. Можно попробовать прием "многопоточных приложений" Thread Object, но у меня перемещение в таймерах.
Код:
void __fastcall TForm2::Timer1Timer(TObject *Sender)
{
if( Where !=0 )     //Если задано направление
  {
 
  if( Where==3)             //Если задано движение вправо
  {             // Устанавливаем соответствующие имя  анимации
  for(int i=1;i<56;i++)      // Запускаем цикл, в каждом новом шаге которого будет рисовать новый кадр анимации
                                  { Timer1->Interval=500;
                                  Application->ProcessMessages();       // Ммм... приводим приложение в чувство, чтобы оно могла перерисоваться
                                                                         // Собственно, перерисовываем форму, стирая тем самым старый кадр анимации
                  Dude->LoadFromFile("n"+String(i/4)+".bmp");       //Загружаем новый кадр анимации под номером i
                         Canvas->Draw(x,y,Dude);
                                   x+=1;
                                   dump->Canvas->FillRect(Rect(0,0,dump->Width,dump->Height));
                                  dump->Canvas->Draw(x,y,Dude);
                                  dump->Canvas->Draw(b,c,bb);              //Выводим на форму
                                  Canvas->Draw(0,0,dump);       // Делаем это для небольших пауз между кадрам
                                 if( Where==5 ) return;  }                   //Увеличиваем положение по x-координата не 5
  }
Подскажите пожалуйста, как можно решить проблему одновременного выполнения операций не меняя принцип перемещения+анимации, или данный код надо в корне менять и обходится без таймеров?
Вот файл http://zalil.ru/31684362

Последний раз редактировалось nikitinign; 12.09.2011 в 08:31.
nikitinign вне форума Ответить с цитированием
Старый 12.09.2011, 08:45   #2
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Код:
Dude->LoadFromFile("n"+String(i/4)+".bmp");       //Загружаем новый кадр анимации под номером i
Вы постоянно считываете данные из файла? Зачем? На это уходит очень много времени. Целесообразнее было бы заранее, при загрузке приложения считать все в массив. А потом работать уже с ним.

Код:
dump->Canvas->FillRect(Rect(0,0,dump->Width,dump->Height));
Операции закраски тоже занимают катастрофически много времени.
Тут тоже есть смысл сделать заранее буфер определенного цвета, потом в каждом цикле рисовать в буфере картинку, и только после этого выводить ее пользователю.

А для чего Вам необходимо одновременное выполнение работ с одним буфером? Это тоже достаточно проблематично организовать работу нескольких потоков с одним набором данных. В любом случае нужно будет блокировать данные на время работы определенного потока. Отсюда вытекает что особого выигрыша вы не получите так как остальные потоки будут ожидать освобождения ресурсов.
Если оптимизировать алгоритм вывода изображений на экран, плюс подключить какую нибудь графическую библиотеку (хотя бы OpenGL) то скорость обработки будет очень высока. И для пользователя будет складываться впечатление что все происходит параллельно.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 12.09.2011, 10:03   #3
nikitinign
 
Регистрация: 30.08.2011
Сообщений: 8
По умолчанию

Цитата:
Сообщение от WorldMaster Посмотреть сообщение
[CODE]
Если оптимизировать алгоритм вывода изображений на экран, плюс подключить какую нибудь графическую библиотеку (хотя бы OpenGL) то скорость обработки будет очень высока. И для пользователя будет складываться впечатление что все происходит параллельно.
Спасибо, я так понимаю надо создавать другой принцип перемещения+анимации, с этим принципом уже не чего не сделаешь. Вообще OpenGL обычно используется для создания 3D, и в основном про это и пишется, подскажите пожалуйста где можно почитать про решение многопоточной проблемы перемещения с помощью 2D OpenGL?
nikitinign вне форума Ответить с цитированием
Старый 12.09.2011, 11:53   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Вообще OpenGL обычно используется для создания 3D,
нет.
Цитата:
где можно почитать про решение многопоточной проблемы перемещения с помощью 2D OpenGL?
где здесь OpenGL?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.09.2011, 13:21   #5
nikitinign
 
Регистрация: 30.08.2011
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
нет.
где здесь OpenGL?
Ну вот примерчик
Вложения
Тип файла: rar Project GL 1.rar (32.9 Кб, 15 просмотров)
nikitinign вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Многопоточные вычисления в среде Delphi 7 (базовый уровень) MaryBlack Фриланс 6 25.08.2011 22:07
Многопоточные приложения С# Arhe Помощь студентам 2 27.08.2009 13:35
Многопоточные приложения MaTBeu Общие вопросы C/C++ 17 24.05.2008 20:37
Делаю сайты, пишу маленькие/большие скрипты. Пишу веб-приложения и приложения под Windows. SkyM@n Фриланс 3 29.12.2007 16:21