Вместо того чтобы создавать 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 is good too (но я уже сказал это).
-Rick
обычно знаем, как структура thread_xyz_params ;-) – EricSchaefer
@Artyom: Спасибо :) – Aaron