crossplatform.ru

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

> Как синхронизировать QThread?, Qt 3.3.8, QThread без слотов и сигналов
DIMEDROLL
  опции профиля:
сообщение 7.2.2010, 21:01
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 165
Регистрация: 28.9.2008
Из: Киев
Пользователь №: 304

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




Репутация:   0  


в общем каша такова:
Пишу на Qt 3.3.8.
Есть класс Считалка, который расчитывает положение 3D точек(вертексов), например:
class MyCalc {
public:
  void CalculatePositions();
  Vertex3D* GetVertexes();
private:
  Vertex3D* vertexes_;
};

CalculatePositions() расчитывает новые положения точек и сохраняет их в массив vertexes_.

Есть класс-виджет MyGLWidget для рендеринга этих точек который унаследован от QGLWidget. И есть главное окно с кнопками, старт и стоп для начала расчетов-рендера и для остановки.

Задача: по кнопке Старт, начать бесконечный цикл CalculatePositions(); GetVertexes(); RenderVertexes();
при этом кнопка Стоп должна оставаться активной, тоесть что бы пользователь мог ее нажать и бесконечный цикл остановился.

Как это правильно сделать?
если я в теле MyGLWidget::onStartButtonPressed() это сделаю, то все зависнет и будет бесконечно рендерится.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Rocky
  опции профиля:
сообщение 7.2.2010, 21:06
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

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




Репутация:   7  


А QApplication::processEvents() тут не поможет?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DIMEDROLL
  опции профиля:
сообщение 7.2.2010, 21:15
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 165
Регистрация: 28.9.2008
Из: Киев
Пользователь №: 304

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




Репутация:   0  


когда то использовал эту функцию в другом приложении, что то было ужасно некрасиво и она выбросилась из моска как "неправильная", но тут сейчас проверю, спасибо
upd: проверил, в принципе работает, но не так как хотелось бы :)
главное окно сильно тормозит, причиной этому я подозреваю CalculatePositions(), эта функция может занимать 0,5 - 5 секунд и в это время события соответственно не будут обрабатываться
Поэтому вопрос остается актуальным.
Я думал сделать так:
Создать поток class MyThread : public QThread,
run() {
  CalculatePositions();
  mutex.lock();
  SetVertexes();
  mutex.unlock();
}

MyGLWidget::onStartButtonPressed() {
  MyThread *thread = new MyThread();
  tread->start();
}

MyGLWidget()::paintGL {
  mutex.lock()
  calculator_->GetVertexes();
  mutex.unlock();
  RenderVertexes();
}


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

Сообщение отредактировал DIMEDROLL - 7.2.2010, 21:38
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DIMEDROLL
  опции профиля:
сообщение 8.2.2010, 23:55
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 165
Регистрация: 28.9.2008
Из: Киев
Пользователь №: 304

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




Репутация:   0  


в общем как это обычно и бывает, полезно на форуме выкладывать свои мысли - тогда проблему видишь более ясно и решение приходит в голову
в предыдущем посте я, в принципе, дал ответ на свой вопрос, просто реализация у меня была несколько не такая как я описал... сделал так как описал и заработало
потом подвешал Таймер и все работает идеально и быстро
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


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


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




RSS Текстовая версия Сейчас: 23.11.2024, 6:08