2009-06-18 6 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