【发布时间】:2014-10-29 07:32:09
【问题描述】:
我有一个带有工作线程的 Qt 应用程序。工作线程使用 2 个 QTimer 以不同的频率执行 2 个函数 void cWorker::updDynamics() 和 void cWorker::updGraphics()。
updGraphics() 连接到主线程中class GLWidget : public QGLWidget 中的一个槽,它只是调用updateGL();
我的问题是,如果我的图形更新率 > 15 Hz,我的主窗口会冻结(GL 小部件已更新,但我无法调整窗口大小或单击按钮)。为什么会发生这种情况,我该如何避免这个问题? - 我希望至少获得 50Hz 的更新。
cWorker::cWorker()
{
m_vertex = 0.1;
}
void cWorker::init()
{
int upd_rate_dynamics = 1000; //Hz
int upd_rate_graphics = 15; //Hz
m_timer_dynamics = new QTimer(this);
connect(m_timer_dynamics, SIGNAL( timeout() ), this, SLOT( updDynamics() ));
m_timer_dynamics->start(1000.0/upd_rate_dynamics);
m_timer_graphics = new QTimer(this);
connect(m_timer_graphics, SIGNAL( timeout() ), this, SLOT( updGraphics() ));
m_timer_graphics->start(1000.0/upd_rate_graphics);
}
void cWorker::updDynamics()
{
std::cout << "cWorker::updDynamics()" << std::endl;
m_vertex += 0.0005;
}
void cWorker::updGraphics()
{
std::cout << "cWorker::updGraphics()" << std::endl;
emit requestRepaint();
}
int main(int argc, char *argv[])
{
cWorker* worker = new cWorker();
QThread* thread = new QThread;
worker->moveToThread(thread);
QObject::connect(thread, SIGNAL(started()), worker, SLOT(init()) );
thread->start();
QApplication a(argc, argv);
MainWindow w;
GLWidget *my_gl_widget = w.findChild<GLWidget*>("widget");
my_gl_widget->m_worker_ptr = worker;
QObject::connect(worker, SIGNAL( requestRepaint() ), my_gl_widget, SLOT( receiveRepaint() ));
w.show();
return a.exec();
}
【问题讨论】:
标签: c++ multithreading qt opengl