Boost 與 Qt 的 Signal / Slot 效能測試

Qt 這個圖形介面的開發套件(官網),基本上算是目前數一數二的跨平台圖形介面開發方案了。

在 Qt 的架構中,要在不同的物件之間傳遞資訊、觸發事件,所使用的是其創造的「Signals & Slots」架構(官方文件)。

而目前除了 Qt 之外,還有許多函式庫,也有提供 Signals & Slots 的功能,像是 Boost C++ Libraries 裡面,就有 boost::signal 和 boost::signal2 這兩個函式庫可以使用;其中,Heresy 也有針對 boost::signal2 做過介紹(參考)。

在 Heresy 來看,Qt 的 signal & slot 的架構比較麻煩的地方,是他必須要使用許多非標準的語法,所撰寫的程式還需要經過 Qt Meta-Object Compiler(moc)來做前處理,才能讓一般的 C++ 編譯器編譯。相較之下,Boost 的 Signal2 在撰寫上的彈性就比較大、也比較方便了。

不過,這兩者個效能怎麼樣呢?這邊 Heresy 就是打算來做個簡單的效能評估。

閱讀全文

在 C++ 裡面呼叫外部程式 Boost.Process

如果想在 C++ 的程式裡面、呼叫外部的程式的話,一般傳統的做法,應該有使用 system()參考)或 C 風格的 popen() 這兩種方法(參考)。

不過,以 system() 來說,他並不能處理外部程式的輸出與輸入,在某些情況下不算實用。

popen() 的話,則是不存在於 MSVC 的環境中,需要使用替代的 _popen()MSDN)才行;同時,popen() 也僅有提供單向、不能雙向(只能寫或讀、不能同時讀寫);真要雙向的使用,其實相當地麻煩(參考)…

而 Boost.Process 則是一個還在開發中、也還沒正式進到 Boost C++ Libraries 的函式庫,他基本上就是希望可以提供一個跨平台、同時有更多功能的外部程序處理函式庫。

它的原始碼在:

https://github.com/klemens-morgenstern/boost-process

目前版本標記是 alpha06、需要搭配支援 C++11 的編譯器、以及 Boost 1.62.0 使用(試過 1.61 不行);文件則是在 http://klemens-morgenstern.github.io/process/

閱讀全文

跨平台的 plugin 開發函式庫:Boost DLL-搭配自訂類別

前面在《基本使用》、《進階》這兩篇文章,應該算是把 Boost.DLL 的一般使用狀況都大概寫過了;不過實際上,Heresy 這邊真正要拿來用的話,應該不會直接匯出函式或變數,而是會採用匯出自訂類別(class)的形式吧~

這樣的概念,主要是自己定義一個抽象類別,在裡面規範好需要那些變數、要實作哪些成員函式,之後就只需要操作這個類別的物件就好了~基本上,應該算是比較物件導向的做法。

而這偏就是來稍微寫一下,該怎麼透過 Boost.DLL、把自訂列別當作外掛的介面來用。


閱讀全文

跨平台的 plugin 開發函式庫:Boost DLL – 進階

這篇是延續前一篇《基本使用》,繼續來整理一些 Boost.DLL 的其他功能。


Alias(別名)

首先,是「alias」(別名)的部分。

在前一篇裡面,已經提過基本的匯出、匯入的方法了。在基本的方法中,要匯出和匯入時,都是直接使用本來的變數、函式名稱;但是有的時候,如果不方便直接使用原有的變數、函式名稱,但是又不好直接去改名的時候,就可以透過 alias 的機制,在匯出時採用另一個名字來匯出。

閱讀全文

跨平台的 plugin 開發函式庫:Boost DLL – 基本使用

Boost.DLL 是 Boost C++ Libraries 在 1.61 版加入的一個新的函式庫,他的設計目的,是讓開發者可以寫出跨平台的 plungin 架構,也就是在程式執行時、再去讀取動態函式庫(DLL、SO/DSO)的檔案來用。

這樣的好處,是可以自己開發一個程式的框架,然後把擴充的方法定義好、讓其他人自行開發符合架構的模組來做擴充;基本上,應該算是一個滿有效、增加程式彈性的方法~

也由於採用這樣的機制可以不需要釋出主程式的原始碼、也可以在不修改主程式的情況下、擴增功能,所以很多軟體,也都是用這種方法來作為擴充、或是提供第三方開發的方法。

而這篇 Heresy 就是簡單測試一下 Boost.DLL 的紀錄了。

閱讀全文

C++11 程式的平行化:async 與 future

之前在《C++ 的多執行序程式開發 Thread:基本使用》這系列文章裡面,Heresy 已經大概整理了一下 C++11 提供的 std::thread 這個執行序函式庫的使用方法了。

不過,實際上在 C++11 的「Thread support library」(參考)裡面,除了 std::thread 以外,還有不少東西可以用。這篇要寫的,就是其中的 std::async()std::future<>

基本上,使用 std::thread 來建立一個新的執行序、另外執行某些計算,在 C++ 中算是比較底層的方法;它的功能很彈性,但是相對的,也有一些比較麻煩的地方。比如說透過 std::thread 執行的函式基本上無法回傳值,而在其他執行序中產生的 exception 也沒有辦法被 catch 到。

std::async() 在某方面來說,則算是一個特化的功能,他的設計概念,就是

當要進行一個沒有馬上要用其結果的複雜計算的時候,把計算丟到另一個執行序去,等到之後真的要用的時候,才去確認他跑完沒、並取得他的結果。

閱讀全文

解決 Boost 在 VC14 CTP6 無法建置的問題

恩…這是一個困擾 Heresy 很久的問題了…Heresy 之前為了嘗鮮,已經把 VisualStudio 安裝到最新的 VisualStudio 2015 預覽版了。而本來基本上都相安無事,但是後來在更新到 CTP6(官方介紹)之後,問題就來了…

但是應該是因為 VisualStudio 2015 CTP6 在 VC 的部分(以下稱「VC14 CTP6」),引進了新的「Universal CRT」(官方介紹)的關係,結果 Heresy 的 Boost C++ Libraries 就這樣無法建置成功了… orz

遇到的錯誤,基本上會像是:

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\crtdefs.h(10):
fatal error C1083: Cannot open include file: 'corecrt.h': No such file or directory

閱讀全文

第二版《The Boost C++ Libraries》

Heresy 是在《Second Edition of "The Boost C++ Libraries" Now in Print and Online》這邊看到的。簡單的講,就是介紹 C++ Boost Libraries 的書出第二版了!

C++ Boost Libraries(官網之前的介紹)在 Heresy 來看,是一個延伸 STL 的函式庫大集合,有許多功能都已經進入了 C++11 的 STL 了。如果是要寫 C++ 程式的話,Boost 在許多時候,應該是一個相當實用的輔助函式庫集;而實際上,Heresy 之前也寫過不少相關的介紹了(彙整列表)。

而《The Boost C++ Libraries》這本書的第二版,是基於 Boost 1.55.0 和 1.56.0 這兩最新的版本來寫的,涵蓋了 Boost 的 72 個函式庫(接近上一版的兩倍),並提供了 430 個完整程式碼範例。他除了提供實體書的版本(Amazon)外,也提供了線上版可以看,網址是:

http://theboostcpplibraries.com/

閱讀全文

OpenCL 的 C++ 函式庫:Boost.Compute

這是前幾天在 GPGPU.org 上看到的消息,原文是《Boost.Compute v0.2 Released》。

基本上,Boost.Compute 是一個基於 OpenCL 的 C++ GPGPU、大量平行化函式庫,主要的設計目的,是用來簡化 GPGPU 程式的開發。Boost.Compute 實際上是一個 OpenCL C API 的一個 C++ wrapper,讓開發者可以用 C++ 的概念、以及 STL-like 的程式風格、來開發 OpenCL 的程式。個人會覺得他的形式應該相當接近 nVIDIA CUDAThrust 這個函式庫。

他的原始碼目前是放在 GitHub 上,網址是:

https://github.com/kylelutz/compute

目前還僅只是 0.2 版、同時也還沒有被納為 Boost C++ Libraries 的一部分,基本上,應該還是算是在測試階段吧~

閱讀全文

Boost Log 的 attribute 的簡易使用

這篇是 Boost Log 這個函式庫的使用紀錄的第三篇(第一篇第二篇),主要是大概紀錄一下,要怎麼使用 Boost Log 在每一筆紀錄裡面附加的 attribute。

說實話,雖然用 Boost Log 來作紀錄是滿方便的~但是,Heresy 不是很喜歡 Boost Log 在格式化、以及篩選時所使用 expression…不知道之後有沒有可能直接用 C++ 標準的 lambda expression 來做?Heresy 覺得那樣應該會好寫很多…

總之,這邊還是來大概寫一下,在 Boost Log 裡面,要怎麼附加 attribute 的資料吧~沒意外的話,這篇就是 Heresy 寫 Boost Log 這個函式庫的最後一篇了。

閱讀全文