質問:
次の場合に、具体的に2 つの引数をCreateThreadに渡す方法:
- タイプの引数 1
SOCKET
- 引数 2、インターフェイス ポインター:
_COM_SMARTPTR_TYPEDEF(Range, __uuidof(Range));
RangePtr pRange; //pass pRange
- タイプの引数 1
提案:
- それに応じて、 CoMarshalInterThreadInterfaceInStreamを使用して、インターフェイス ポインターの場合、
質問:
次の場合に、具体的に2 つの引数をCreateThreadに渡す方法:
SOCKET
_COM_SMARTPTR_TYPEDEF(Range, __uuidof(Range));
RangePtr pRange; //pass pRange
提案:
これら 2 つのタイプの構造体を作成し、その構造体へのポインターを渡します。これは、単一ポインターを介してスレッドにデータを渡す標準的な方法です。
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();
}
};
次に、2 つの引数を取る関数があるとします。
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);
}
};
オンデマンドでそのファンクターのインスタンスを初期化します。
int main()
{
Thread<StringFunc> myThread(StringFunc("hello","world"));
Sleep(500);
return 0;
}
私は最後に眠っていることに注意してください.スレッドが完了するのを待つことについてあなたは何も言わなかった. ..
boost::thread も良いです(しかし、私はすでにそれを言いました)。
-リック
std::pair
あなたの友達です。
WM_COPYDATAを投稿して、スレッドが開始された後の時点でCOPYDATASTRUCTに入力することもできます(参照:http://msdn.microsoft.com/en-us/library/ms649011(VS.85).aspx)