首先來說說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 意見:
張貼留言