[048] JUCE Diary #7: 基本架構

[048] JUCE Diary #7: 基本架構

Projucer 創建的專案範本包含的基本元素,其相關檔案如下:

  • Main.cpp
  • MainComponent.cpp
  • MainComponent.h

以時下流行的 MVC pattern 來類比,Main.cpp 大概就是 Controller,而 MainComponent.cpp/MainComponent.h 則是 View。Model 還沒有,視情況自己補。

上回 Projucer 建立的 GUIApp 專案的主要檔案 Main.cpp 裡頭有一個 GUIAppApplication class(類別,以後不中譯了),繼承自 JUCEApplication。這個 JUCEApplication 很重要,化成灰都要記住它,以後再慢慢解釋。

使用 JUCE 這類工具的好處是,雜事交給它們,我們專心辦正事。

凡事有開始就有結束,感情如是,應用程式亦然。用 JUCE 開發應用程式,以下幾點很重要:

  • 從哪裡開始執行?
  • 在哪裡結束?
  • 如何主動要求分手結束?

從哪裡開始執行?

JUCE 程式執行時會先建立 GUIAppApplication (不同專案名字皆異)物件,這點從 START_JUCE_APPLICATION (juce_Initialisation.h) 巨集可以觀察到(有原始碼的好處)。經過一連串無需理會的程式碼後,主執行緒會呼叫 JUCEApplication::initialise method,參數為命令列參數(不包含執行檔名)。

因此,有兩處可以擺「初始化程式碼」(只執行一次的碼):

  1. GUIAppApplication 建構式(Constructor or ctor)
  2. GUIAppApplication::initialise

建構式先來,再來才是 initialise。通常,我會在建構式裡做成員變數初始化(member variable),其他則放到 initialise 裡。

在哪裡結束?

JUCE 程式結束時會呼叫 JUCEApplication::shutdown method,這裡適合清理資源。另一個地方就是 GUIAppApplication 解構式。

值得留意的是 GUIAppApplication::systemRequestedQuit 這個函數會先被呼叫,預設是呼叫 quit 函數,改成什麼都不做的話,程式就不會結束,所以 shutdown 就不會被呼叫。(沒事不會去改 systemRequestdQuit

如何主動要求結束?

讓程式結束的方法很簡單,即呼叫 GUIAppApplication::systemRequestedQuit