如何通專門參數CreateThread,當:
- 參數之一,
SOCKET
類型 - 參數二,一個接口指針:
_COM_SMARTPTR_TYPEDEF(Range, __uuidof(Range));
RangePtr pRange; //pass pRange
- 參數之一,
建議:
- 對於接口指針,使用CoMarshalInterThreadInterfaceInStream,因此,
如何通專門參數CreateThread,當:
SOCKET
類型_COM_SMARTPTR_TYPEDEF(Range, __uuidof(Range));
RangePtr pRange; //pass pRange
建議:
創建這兩種類型的結構並將指針傳遞給它。這是通過單個指針將數據傳遞給線程的標準方式 。
而不是創建struct_thread_xyz_params,如果可能的話,我會首先使用boost :: thread。如果這不是一種選擇,我會創建一個包裝模板函數對象,當它被構建與自身要求的CreateThread:
template <class Func>
class Thread
{
Func m_Func;
static DWORD WINAPI ThreadFunc(void* param)
{
Thread& pFunc = *(Thread*)param;
pFunc();
return S_OK;
}
public:
Thread(Func& func): m_Func(func){
CreateThread(NULL,NULL,Thread::ThreadFunc,this,NULL,NULL);
};
void operator()()
{
m_Func();
}
};
那麼如果我有花有兩個參數的函數:
void printTwoStrings(string a, string b)
{
cout << a << " " << b << endl;
};
我可以將它們包裝在一個函子:
class StringFunc
{
string m_a;
string m_b;
public:
StringFunc(string a, string b):m_a(a),m_b(b)
{
};
void operator()(){
printTwoStrings(m_a,m_b);
}
};
和按需initiliaze該函子的一個實例:
int main()
{
Thread<StringFunc> myThread(StringFunc("hello","world"));
Sleep(500);
return 0;
}
請注意,我在最後睡着了,你根本就沒有說任何關於等待線程完成的任何信息...... struct_xyz_params的難點在於你經常需要稍後的struct_wxyz_params和複製的誘惑代碼總是高...
boost :: thread也很好(但我已經說過了)。
-Rick
你也可以發表WM_COPYDATA,在以後灌裝COPYDATASTRUCT線程啓動(參考:http://msdn.microsoft.com/en-us/library/ms649011(VS.85).aspx)後
通稱結構thread_xyz_params ;-) – EricSchaefer 2009-02-22 20:26:34
@Artyom:謝謝:) – Aaron 2009-02-22 20:38:29