2009-06-18 10 views
2

Qtを使用していくつかの科学データ用のOpenGL視覚化プログラムを作成しようとしています。私は既存のプログラムをそのまま使用でき、glwidgetを呼び出して、各タイムステップの最後にデータを更新するように伝えることができるようにしたいと考えています。しかし、Qtプログラムを実行するには、QApplicationを使用してから、qt.run()を使用してCPUをブロックする必要があります。ここでOpenGLとQtによる科学的視覚化

は私がQThreadへの私の既存のコードのすべてを入れて、更新に接続するために行われている時はいつでも、それは信号を送るかもしれないことを認識した擬似コード

main() 

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

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

です。この方法で簡単にできます。誰かがこれを解決する方法を知っていますか?

答えて

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

タイマーを使用して私がそれをやる方法ですこの答えをUpvoted。別のスレッドの必要はありません。 しかし、私は再描画スロットへのシングルショットタイマーの必要性と、なぜウィジェットがQGLWidgetではなくQDialogのサブクラスであるのか分かりません。 – Troubadour

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のコンテキストで実行されないでしょうか? –

+0

いいえ、Qtメインイベントループがスレッドを処理し、すべて正常に動作します。 – alisami