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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.01.2014, 20:01   #1
stalker1995s
Gamedeveloper
Форумчанин
 
Аватар для stalker1995s
 
Регистрация: 11.07.2012
Сообщений: 149
Сообщение Потоки, синхронизация

Всем привет!

Некоторое время назад, понадобилось сделать точную задержку при смене кадров до мили секунд. Выходит, что все трансформации(хождение по кадрам) требуется делать в потоках, реализовал в потоках. Но, появилась следующая проблема, модель при проигрывании начинает глючить, проверил все, в процедуре с трансформациями все нормально ошибок нету. Оказывается, как и предполагалось проблема заключается в десинхронизации потоков, как я понял, это из за того, что класс с мешами я создаю в главном потоке. Проблему удалось решить с помощь критических секций или метода "Synchronize();" - Проблема была решена, но! ФПС проседает очень сильно, к примеру без синхронизации с глюком при анимировании фпс 64 и не дергается. А тут 17-18. В чем может быть проблема ? И как синхронизировать потоки, без нагрузки на получается главный поток ?.
stalker1995s вне форума Ответить с цитированием
Старый 08.01.2014, 20:08   #2
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

надо полагать что в потоковой процедуре кроме Synchronize ничего нет?
eval вне форума Ответить с цитированием
Старый 08.01.2014, 22:52   #3
stalker1995s
Gamedeveloper
Форумчанин
 
Аватар для stalker1995s
 
Регистрация: 11.07.2012
Сообщений: 149
По умолчанию

Вот как вызывается процедура трансформации из потока

Код:
procedure Thmesh.Execute;
begin
  inherited;
   Anim[ID].Proces:= True;
   Synchronize(Anim[ID].Animation);
   Anim[ID].Proces:= False;
end;
Чтобы не вызывать трансформацию подряд, я проверяю находится ли модель в процессе, т.е работает ли над ней уже поток. Делаю это так:

Код:
Взято из цыкла.
   if (Anim[i].Play=True) and (Anim[i].Proces=False) then
    begin

     CM:= Thmesh.Create(True);
     CM.Priority:= tpLower;
     CM.FreeOnTerminate:= True;

     CM.ChangeStar(i); // ChangeStar передает в класс ID обекта над которым будет происходить трансформация. И запускает поток через метод Resume;
    end;
Код процедуры ChangeStar;

Код:
procedure Thmesh.ChangeStar(IDMesh: integer);
begin
 ID:= IDMesh;
 //Resume
 Resume;
end;
stalker1995s вне форума Ответить с цитированием
Старый 08.01.2014, 23:09   #4
STRELOK-2007
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 144
По умолчанию

лучше всего ВООБЩЕ забыть про Synchronize, а использовать SendMessage или PostMessage (на Handle главного окна, например).

1) не стопает ВСЕ потоки
2) нет проблем с синхронизацией из DLL

А для не VCL, вообще использовать только TCriticalSection или Mutex
STRELOK-2007 вне форума Ответить с цитированием
Старый 09.01.2014, 00:00   #5
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
Вот как вызывается процедура трансформации из потока
ну значит так и есть.. это неправильно, поток тут вам ничем не поможет, и даже наоборот
eval вне форума Ответить с цитированием
Старый 09.01.2014, 12:51   #6
stalker1995s
Gamedeveloper
Форумчанин
 
Аватар для stalker1995s
 
Регистрация: 11.07.2012
Сообщений: 149
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
ну значит так и есть.. это неправильно, поток тут вам ничем не поможет, и даже наоборот
А что же тогда делать, ведь в процедуре трансформации я вызываю задержку методом sleep ?
stalker1995s вне форума Ответить с цитированием
Старый 09.01.2014, 17:03   #7
doktor255
Заблокирован
 
Регистрация: 31.03.2011
Сообщений: 976
По умолчанию

stalker1995s Используй таймер.
doktor255 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Потоки. Закрываются все потоки при ошибке в одном. Son Общие вопросы Delphi 11 01.11.2013 09:32
Потоки, синхронизация, простой denrubun Общие вопросы C/C++ 11 29.06.2013 13:37
Синхронизация kuba1981 PHP 9 06.05.2013 11:39
Синхронизация БД Bright-rider БД в Delphi 3 19.06.2012 07:32
синхронизация perun47 Microsoft Office Excel 0 31.01.2012 22:35