crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> таймеры, контейнер и доступ к нему
efg
  опции профиля:
сообщение 6.1.2012, 16:02
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 48
Регистрация: 6.5.2011
Пользователь №: 2658

Спасибо сказали: 2 раз(а)




Репутация:   0  


пишу игру. использую физический движок (box2d).
суть в том, что есть элементы, которые постоянно создаются по событию одного таймера (назовём его Таймер1) и ложатся в Контейнер (QList), их жизнь довольно коротка: они либо самоуничтожатся через несколько секунд, либо, от взаимодействия с игроком они опять же уничтожатся, но при этом кроме простого удаления из памяти и со сцены, нужно будет выполнить некоторые действия (добавить некоторые количество очков, например, и анимировать всё это дело). и сложность тут в следующем - для обновления физики и последующего изменения координат\углов наклона всех тел используется таймер (назовём его Таймер2), присоединённый ко слоту updatePhysics();
дело в том, что в некоторых случаях при вычислении столкновений тел приложение падает. намертво виснет. и дело не в указателях, я проверял. указатели всегда правильные, память чистится вовремя и там, где нужно.
кажется, дело может быть только как раз в том, что оба таймера используют один контейнер: физика обновляется очень часто, порядка 30 раз в секунду, и из-за этого могут возникнуть какие-нибудь конфликты. вопрос как раз в следующем: как работают таймеры в Qt? ничего многопоточного писать ещё не приходилось, поэтому не до конца представляю, что, собственно, может происходить. выполнится ли слот, присоединённый к событию timeout() таймера, если предыдущий вызот слота ещё не был завершён?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 7.1.2012, 12:43
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2931
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


моменты созданию экземпляром и удаления нужно синхронизировать, если работа с ними происходит из разных потоков

кроме того, синхронизировать нужно и доступ к контейнеру, так как при добавлении или удалении элемента итераторы могут стать невалидными
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
efg
  опции профиля:
сообщение 3.6.2012, 4:54
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 48
Регистрация: 6.5.2011
Пользователь №: 2658

Спасибо сказали: 2 раз(а)




Репутация:   0  


Алексей1153, спасибо, поток только один. проблема была в том, что box2d возвращал (таки) невалидные указатели на объекты контактов. теперь не могли бы вы подробнее рассказать о внутреннем устройстве таймеров?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 4.6.2012, 7:33
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2931
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


efg, зачем знать их внутреннее устройство ? :) Обрабатывай сообщения от них и всё.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


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




RSS Текстовая версия Сейчас: 23.5.2022, 23:06