2009-06-18 78 views
2

科学可视化我试图写使用Qt的一些科学数据OpenGL的可视化程序。我希望能够不改变我的现有程序,只需调用glwidget并在每个时间步结束时告诉它更新数据即可。然而,为了运行一个Qt程序看起来你必须使用QApplication然后qt.run()该块CPU。使用OpenGL和Qt

这里是伪代码

main() 

{ 
    ..set up stuff 
    myVisualizer = new myGLWidget(); 

    for(int i=0;i<1000;i++) 
    { 
     ..do calculations 
     myVisualizer.update(new data) 
    } 
} 

我意识到,我可以把我所有的现有代码的QThread并将其发送信号时,它是为了连接到一个更新。这样做会更容易。有谁知道如何解决这个问题?

回答

2

如果你真的不想要调查螺纹的解决方案,这将是更好的周围的一切,您可以使用以0基本上特殊情况下超时,当您运行为0的超时计时器,它处理的是目前在事件发生后运行相应的代码事件队列。所以,你可以建立这样的事情:

class MyDialog : public QDialog 
{ 
    Q_OBJECT 
public: 
    MyDialog() 
    { 
     m_step = 0; 
     QTimer::singleShot(0, this, SLOT(Process())); 
    } 

public slots: 
    void Process() 
    { 
     // do calculations 
     m_step++; 
     QTimer::singleShot(0, this, SLOT(Redraw())); 
     if (m_step != 1000) 
      QTimer::singleShot(0, this, SLOT(Process())); 
    } 

    void Redraw() { // do redrawing code here } 

private: 
    int m_steps; 
}; 

然后用Qt的正确主代码结合起来:

int main(int argc, char** argv) 
{ 
    QApplication app(argc, argv); 
    MyDialog dialog; 
    dialog.show(); 
    return (app.exec()); 
} 
0

您可以在应用程序中使用的QThread并在一个单独的线程做计算。 你所要做的就是继承QThread并实现run()方法。

您可以创建一个计算器类,并在该类添加一些信号和信号连接到显示部件的更新插槽(在这种情况下QGLWidget来绘图:: updateGL())。

这里是一个粗略的例子:(所有你必须是建立在你的main()函数线程和DisplayWidget和设置线程的DisplayWidget)

class Calculator: public QObject 
{ 
    Q_OBJECT 

    public: 
     Calculator(); 
     void start(); 

    signals: 
     void updateDisplayWidget(/* you can put the resulting data */); 
}; 

class DisplayWidget(): public QGLWidget 
{ 
    Q_OBJECT 
    // override paint methods here 
    public slots: 
      void slotUpdateDisplayWidget(/* you can receive the resulting data*/); 
}; 

class MyThread : public QThread 
{ 
public: 
    void run(); 
    void setDisplayWidget(DisplayWidget* displayWidget); 

private: 
    Calculator mCalculator; 
}; 

void MyThread::run() 
{ 
    mCalculator.start(); 
    exec(); 
} 

MyThread::setDisplayWidget(DisplayWidget* displayWidget) 
{ 
    displayWidget->moveToThread(this); 
    connect(&mCalculator, SIGNAL(updateDisplayWidget()), displayWidget, SLOT(slotUpdateDisplayWidget())); 
} 
+0

不会在DisplayWidget插槽中的QThread的上下文中运行? – 2009-06-18 09:23:41

+0

nope,Qt主事件循环处理线程,一切都会正常工作。 – alisami 2009-06-18 10:56:31