QThread & Taipei101 Fireworks in OpenGL

2015-12-31_130012

在 2015 的最後一天,就用 Taipei101 Firework 這個程式來做個階段型的結尾吧~猶如降龍十八掌的第十八式,集結前面所學,所施展出來的招式。今天這個 Project 也是從之前所學到的繪製 2D & 3D Object、Texture Mapping、Quadric Object、Keyboard Control 到 Particle Engine 來完成的。但今天不再細說前面曾經提過的內容,今天主要是介紹 Qt 裡面的 QThread 來實現我的煙火特效。

● QThread

在 QThread 裡面有三個主要的 Public Slots 來控制 Thread 開始、結束和退出。分別是 void start(); void terminate(); void quit();;而 Thread 要執行的內容則是透過一個 protected function : void run(); 來實現,所以今天要求 Thread 做甚麼事情全都要寫在 run() 函式裡面。

class myThread : public QThread
{
 Q_OBJECT
public:
 myThread();
 ~myThread();
public slots:
 void start_mythread();
signals:
 void signal_firework();
protected:
 void run();
};

上面的 myThread 是我在 Taipei101 Firework 這個專案裡面所設定的 Thread。

void myThread::start_mythread()
{
 this->start();
}

start_mythread() 是一個 slots,作用就是啟動我的 Thread。

void myThread::run()
{
 double a = 0;
 while(1)
 {
 if(FIREWORK_UPDATE)
 {
 emit signal_firework();
 FIREWORK_UPDATE = false;
 }}}
connect(mythread, SIGNAL(signal_firework()),
        myqgl, SLOT(firework_update()));

接著在 run() 裡面就是指派我的 Thread 裡的工作,工作內容很簡單,就是在一個 while 迴圈內一直執行 emit signal_firework() 。這個 emit 指的是去發送 signal_firework() 訊號出去,讓接收到這個訊號的人做下一步的動作。例如我這裡將 mythread 訊號與我的 mygql 做連結(connect),所以當 myqgl 接收到 signla_firework() 訊號後,就會執行 firework_update() 的動作。特別注意到我這裡用 FIREWORK_UPDATE 來控制 emit 的動作,當我完成上一個 update 後,才會再發送下一次的 signal_firework(),作用是為了避免程式不停的發送 emit ,而使序列(queue) 裡面堆積太多的訊號要執行,到最後整個程式會因為有做不完的 update 而當掉。

 

 


● Taipei101 Fireworks

這個程式有三種形式的煙火,由三種不同的 Particle Engine 來實現,分別是迴旋式煙火、階段式煙火以及噴發式煙火。Particle Engine 的設定請看 L10

101_firework

最後 demo 影片效果囉。Happy New Year~~~

 

 


reference : http://doc.qt.io/qt-4.8/qthread.html

 

Leave a Reply

Your email address will not be published. Required fields are marked *