Frage

Ich bin versucht zu schreiben, eine OpenGL-Visualisierung-Programm für einige wissenschaftliche Daten mit Qt.Ich möchte in der Lage sein, um meine bestehende Programm unverändert und einfach aufrufen zu können glwidget und sagen, es zu aktualisieren, die Daten am Ende jeder Zeitschritt.Aber um ein Qt-Programm, es scheint, Sie haben zu verwenden QApplication und dann qt.run() die Blöcke der cpu.

Hier ist der pseudo-code

main()

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

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

Ich weiß, dass ich könnte alle meine vorhandenen code in einem QThread und haben es senden ein signal, wenn es getan wird, um eine Verbindung zu einem update.Es würde leichter sein, dieser Weg.Hat jemand eine Idee wie man dieses Problem lösen?

War es hilfreich?

Lösung

Wenn Sie wirklich wollen nicht die Gewinde Lösung zu untersuchen, die alle um schöner sein würden, können Sie das Spezialfall-Timeout mit 0 verwenden Grundsätzlich, wenn Sie einen Timer mit einem Timeout von 0 ausführen, wird es die entsprechender Code nach den Ereignissen der Verarbeitung, die derzeit auf der Ereigniswarteschlange ist. So können Sie so etwas wie dies ein:

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;
};

Und dann verbinden sie mit dem Qt-korrekten Hauptcode:

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

Andere Tipps

Sie können QThread in Ihrer Anwendung und führen Sie die Berechnungen in einem separaten thread.Was Sie tun müssen, ist die Unterklasse der QThread und implementieren Sie die Methode run ().

Erstellen Sie eine calculator-Klasse, und fügen Sie einige Signale, die in dieser Klasse, und schließen Sie das signal an Ihre Anzeige-widget update-slot (in diesem Fall QGLWidget::updateGL()).

Hier ist ein grobes Beispiel:(Alles, was Sie haben, ist das erstellen von thread und DisplayWidget in Ihrer main () - Funktion, und legen Sie die Gewinde der 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()));
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top