Есть академический интерес в создании небольшого набора классов-оберток вокруг апишных функций работы с потоками и объектам синхронизации. ATL хорошо, но громоздко.
Сейчас никак не соображу, как правильно написать код, позволяющий в качестве рабочей функции потока указать член-функцию класса. Делаю так:
Спокойно компилируется, если создавать поток в конструкторе Test2 (закоменченный код). Но мне хочется инкапсулировать все эти хэндлы в отдельном классе, потому пытаемся создать поток через класс Test. Получаем точно такую же ошибку.
Буду благодарен советам.
1. Вместо CreateThread следует использовать _beginthreadex (см. описание CreateThread в MSDN).
2. thread_to_member_thunk<T, this->*ClassFunction> — это какая-то бессмыслица. Нельзя передавать шаблонным аргументом первое что под руку попало. Если ты хочешь, чтобы указатель на нестатический метод мог вычисляться во время выполнения программы, то тебе нужно передавать его не шаблонным аргументом в некую функцию-переходник, а через параметр типа void* функции _beginthreadex (т.е. тем же путём, что и объект). Вдобавок тебе следует обдумать, кто должен владеть объектом. Если твой объект скончается до того, как создаваемый поток завершит выполнение метода этого объекта, то может случиться что-то нехорошее.
Здравствуйте, Masterkent, Вы писали:
M>KickingBear: M>thread_to_member_thunk<T, this->*ClassFunction> — это какая-то бессмыслица.
Да, оплошал. По-видимому, какой-то невалидный эксперимент скопировал в форум, вместо нормального кода)
По поводу beginthreadex — уже не в первый раз натыкаюсь, почитаю.
Спасибо за совет
Здравствуйте, KickingBear, Вы писали:
KB>Есть академический интерес в создании небольшого набора классов-оберток вокруг апишных функций работы с потоками и объектам синхронизации. ATL хорошо, но громоздко. KB>Сейчас никак не соображу, как правильно написать код, позволяющий в качестве рабочей функции потока указать член-функцию класса. Делаю так:
Посмотрите на boost::thread.
Если делать его своими руками, то можно в качестве "хранилища" для произвольных функций использовать boost::function.
Если и boost::function не хотите использовать, то вот тут http://habrahabr.ru/blogs/cpp/78299/ объясняют, как сделать что-то похожее своими руками