سؤال

وأنا أحاول أن أكتب برنامج برنامج OpenGL التصور لبعض البيانات العلمية باستخدام كيو تي. وأود أن تكون قادرة على استخدام برنامجي الحالية دون تغيير، وببساطة تكون قادرة على استدعاء glwidget وأقول ذلك لتحديث البيانات في نهاية كل خطوة الوقت. ولكن من أجل تشغيل برنامج كيو تي يبدو لديك لاستخدام QApplication ثم 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;
};

وثم دمجها مع رمز الرئيسي كيو تي الصحيح:

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

نصائح أخرى

ويمكنك استخدام QThread في التطبيق الخاص بك والقيام الحسابات في موضوع منفصل. ما عليك القيام به هو فئة فرعية QThread وتنفيذ طريقة تشغيل ().

ويمكنك إنشاء فئة آلة حاسبة وإضافة بعض الإشارات في تلك الفئة وتوصيل إشارة إلى فتحة تحديث عرض القطعة الخاص بك (في هذه الحالة QGLWidget :: updateGL ()).

وهنا مثال تقريبي: (كل ما عليك هو خلق الخيط و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()));
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top