OpenGLとQtによる科学的な視覚化
-
06-07-2019 - |
質問
Qtを使用して、一部の科学データのOpenGL視覚化プログラムを作成しようとしています。既存のプログラムを変更せずに使用し、glwidgetを呼び出して、各タイムステップの最後にデータを更新するように指示できるようにしたいと思います。ただし、Qtプログラムを実行するには、 QApplication
を使用し、次にCPUをブロックする qt.run()
を使用する必要があります。
これは擬似コードです
main()
{
..set up stuff
myVisualizer = new myGLWidget();
for(int i=0;i<1000;i++)
{
..do calculations
myVisualizer.update(new data)
}
}
既存のすべてのコードを QThread
に入れて、更新への接続が完了するたびに信号を送信できることを認識しています。この方法の方が簡単です。誰もこれを解決する方法を知っていますか?
解決
スレッド化されたソリューションを調査したくない場合は、特別な場合のタイムアウト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-properメインコードと組み合わせます:
int main( int argc, char** argv )
{
QApplication app( argc, argv );
MyDialog dialog;
dialog.show();
return ( app.exec() );
}
他のヒント
アプリケーションで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()));
}
所属していません StackOverflow