2

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

これが擬似コードです

main()

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

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

QThread既存のすべてのコードをに入れて、更新への接続が完了するたびにシグナルを送信させることができることに気付きました。この方法の方が簡単です。誰かがこれを解決する方法を知っていますか?

4

2 に答える 2

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-properメインコードと組み合わせます。

int main( int argc, char** argv )
{
    QApplication app( argc, argv );
    MyDialog dialog;
    dialog.show();
    return ( app.exec() );
}
于 2009-06-18T17:05:21.547 に答える
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()));
}
于 2009-06-18T09:07:09.753 に答える