Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Общие вопросы _ Как синхронизировать QThread?

Автор: DIMEDROLL 7.2.2010, 21:01

в общем каша такова:
Пишу на 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

А QApplication::processEvents() тут не поможет?

Автор: DIMEDROLL 7.2.2010, 21:15

когда то использовал эту функцию в другом приложении, что то было ужасно некрасиво и она выбросилась из моска как "неправильная", но тут сейчас проверю, спасибо
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 8.2.2010, 23:55

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

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)