首先來說說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; }幾個基本要注意的地方:
- "windows.h"一定要include進來,不然不認得啥是DWORD WINAPI等
- Thread只能帶一個參數,不管你是WinAPI的,還是MFC的AfxBeginThread
- DWORD WINAPI ThreadName(LPVOID pt)是Thread的固定宣告方式
#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的步驟如下:
- 去官網把Boost給Download回來 - http://www.boost.org/users/history/version_1_48_0.html
- 解壓縮到想放的資料夾(比方說X:\Boost)後,可以看到bootstrap.bat,點兩下執行,會產生「b2.exe」和「bjam.exe」
- 叫出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 - 在Visual Studio設定「屬性頁面->C/C++->General->Additional Include Directories」加入Boost的路徑,比方說「X:\Boost\boost_1_48_0」
- 如果Link找不到lib出錯的話,再去「屬性頁面->Linker->Additional Library Directories」加入第三步的Library路徑,比方說「X:\Boost\boost_1_48_0\bin\vc9\lib」
- 編譯,完成
0 意見:
張貼留言