ethan hunt wrote:

> Господа,

> извиняюсь за тупость, но почему в отдельный поток можно кидать только статическую функцию-член класса. До конца не понимаю (может из-за недосыпания).

Потому, что статическая функция-член имеет такой же тип, как и обычная ф-ция (в отличее от нестатической фун-ции-члена). В win32 и POSIX ф-ция создания потока принимает указатель именно на обычную ф-цию. Но это вовсе не значит, что ты не можешь направить поток в ф-цию-член, просто для этого тебе придется использовать переходник, который будет перенаправлять поток в функцию-член:

template<class T, DWORD(T::*mem_fun)()>
inline
DWORD WINAPI thread_to_member_thunk(void* p)
{
     return (static_cast<T*>(p)->*mem_fun)();
}


Используем:

struct some
{
     DWORD f() { return 0; }
};

int main()
{
     some s;
     // в качестве параметра (lpParam) передаем указатель на объект, чтобы переходник направил поток именно в этот объект
     CreateThread(0, 0, thread_to_member_thunk<some, &some::f>, &s, 0, 0);
}


--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 beta
Автор: MaximE    Оценить