问题:
如何将两个参数具体传递给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
建议:
创建这两种类型的结构并将指针传递给它。这是通过单指针向线程传递数据的标准方式。
如果可能,我将首先使用 boost::thread,而不是创建 struct_thread_xyz_params。如果这不是一个选项,我将创建一个包装模板函数对象,该对象在构造时使用自身调用 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);
}
};
并按需初始化该函子的一个实例:
int main()
{
Thread<StringFunc> myThread(StringFunc("hello","world"));
Sleep(500);
return 0;
}
请注意,我最后正在睡觉,您根本没有说等待线程完成... struct_xyz_params 的困难在于您经常需要稍后的 struct_wxyz_params 并且重复代码的诱惑总是很高。 ..
boost::thread 也很好(但我已经说过了)。
-瑞克
std::pair
是你的朋友。
您还可以发布 WM_COPYDATA,在线程启动后稍后填充 COPYDATASTRUCT(参考: http: //msdn.microsoft.com/en-us/library/ms649011 (VS.85).aspx )