[C++]好好用的Boost::Thread

先前maintain很久的API,知道有Boost這個東西,但是只用過他的Bind功能,至於其他的功能完全沒碰過。剛好在debug時,查Boost相關的不經意的看到有Thread這功能,認真看了一下才發現他還真的是超好用,又直覺!

首先來說說Windows的Thread,有用過的就知道,Thread就是一個可以多工的方式。如果要帶參數的話,把任意型態轉換成LPVOID指標即可,然後一樣在原先的Thread Function透過轉換來使用。那問題來了!一個參數都沒問題,需要帶二個參數以上呢?那就得善用他唯一的參數LPVOID,比方說利用Class,利用Structure這些都可以。我用VS 2008新增一個Win32 console專案,展示如何利用Class帶多個參數進入WinAPI Thread,很簡單的一個Demo,把參數值顯示在螢幕上而已:
#include "stdafx.h"
#include <windows.h>
class ThreadArgs{ //用來載多個參數的Class
public:
   int arg1,arg2;
};
DWORD WINAPI CThread1(LPVOID pt)
{
    ThreadArgs *lpArgs=(ThreadArgs *)pt;
    printf("(C++)value 1 = %d, value 2 = %d\n", lpArgs->arg1, lpArgs->arg2);
    return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
    // for C++ Thread
    ThreadArgs threadAugs;
    threadAugs.arg1 = 100;
    threadAugs.arg2 = 200;
    DWORD threadID;
    ::CreateThread(NULL, 0, &CThread1, (LPVOID)&threadAugs, 0, &threadID);
    ::Sleep(100);
    return 0;
}
幾個基本要注意的地方:
  1. "windows.h"一定要include進來,不然不認得啥是DWORD WINAPI等
  2. Thread只能帶一個參數,不管你是WinAPI的,還是MFC的AfxBeginThread
  3. DWORD WINAPI ThreadName(LPVOID pt)是Thread的固定宣告方式
而如果用Boost的方式呢?
#include <boost/thread.hpp> 
void BoostThread1(int value1, int value2)
{
    printf("(Boost)value 1 = %d, value 2 = %d\n", value1, value2);
}
int _tmain(int argc, _TCHAR* argv[])
{
    // for Boost Thread
    boost::thread m_Thread;
    m_Thread = boost::thread(BoostThread1, 100, 200);//參數直接帶
    m_Thread.join();//目的在等待Thread做完,不然還沒啟動主程式就結束了,看不到結果
    return 0;
}
嘿沒錯!這樣就好了。重點就在於:Thread Function形式可以任意宣告,可以帶多個參數。有沒有這麼直覺啊!之後還可以繼續研究Bind來將參數給Bind一起。

要建立Boost環境,也不會太難,花一點時間就好,在Windows的步驟如下:
  1. 去官網把Boost給Download回來 - http://www.boost.org/users/history/version_1_48_0.html
  2. 解壓縮到想放的資料夾(比方說X:\Boost)後,可以看到bootstrap.bat,點兩下執行,會產生「b2.exe」和「bjam.exe」
  3. 叫出Windows的console(cmd.exe)去執行底下這段,等待個大概5分鐘左右,Boost的函式庫就自動編譯好了。因為我用VS2008,所以設定為9.0,stagedir修改為自己路徑就好。without表示哪些不編譯,如果對參數有興趣的,這個人寫得很詳細,我只是copy來用而已:
    bjam stage --toolset=msvc-9.0 --without-graph --without-graph_parallel --without-math --without-mpi --without-python --without-serialization --without-wave --stagedir="X:\boost\bin\vc9"  link=static runtime-link=shared runtime-link=static threading=multi  debug  release
  4. 在Visual Studio設定「屬性頁面->C/C++->General->Additional Include Directories」加入Boost的路徑,比方說「X:\Boost\boost_1_48_0」
  5. 如果Link找不到lib出錯的話,再去「屬性頁面->Linker->Additional Library Directories」加入第三步的Library路徑,比方說「X:\Boost\boost_1_48_0\bin\vc9\lib」
  6. 編譯,完成
把兩個程式合在一起後,執行的畫面如下:


0 意見:

搜尋此網誌

總網頁瀏覽量

TK呱呱

Made with by TK