Есть класс, у него имеется несколько НЕ статических ф-й которые реализуют логику работы в потоке. Необходимо запустить их в пок.
Данный класс не отнаследован от потоковых классов. На текущий момент применяю след. технику:
CreateThread(..., Runner ,this,...);//вызов глобальной ф-и Run, которой через параметры передаю адрес поинтера на обьект класса.
DWORD WINAPI Runner (LPVOID par)
{reinterpret_cast<Some*> (par)->Do();}//Вот ф-я и в потоке.
Какие есть еще варианты? Этот не очень удобен хотябы тем что нужно плодить разные версии Runner для разных классов и методов...
Здравствуйте, loknalori, Вы писали:
L>Какие есть еще варианты? Этот не очень удобен хотябы тем что нужно плодить разные версии Runner для разных классов и методов...
Здравствуйте, bkat, Вы писали:
B>Здравствуйте, loknalori, Вы писали:
L>>Какие есть еще варианты? Этот не очень удобен хотябы тем что нужно плодить разные версии Runner для разных классов и методов...
B>http://www.rsdn.ru/Forum/Info.aspx?name=FAQ.cpp.threadandmember
Здравствуйте, loknalori, Вы писали:
L>Скажите, вы иходное сообщение читали? В нем как раз и описан тот способ на который вы дали линк.
Упреждаю ответ. То что используется тимплейтовская оберка — суть дела не меняет.
Здравствуйте, loknalori, Вы писали:
L>Здравствуйте, loknalori, Вы писали:
L>>Скажите, вы иходное сообщение читали? В нем как раз и описан тот способ на который вы дали линк. L>Упреждаю ответ. То что используется тимплейтовская оберка — суть дела не меняет.
Ну если ничего не меняет, то и не пользуй.
Хотя, на мой взгляд, как раз твою проблему с разными версиями Runner решает.
Здравствуйте, loknalori, Вы писали:
L>Какие есть еще варианты? Этот не очень удобен хотябы тем что нужно плодить разные версии Runner для разных классов и методов...
Вариант раз:
Элементарно, Ватсон. Ты просто не сделал последний шаг в своих рассуждениях. Не хочешь плодить — пиши шаблон.
template<class R, class T, R(T::*Fun)()>
DWORD CALLBACK runner(void* p) { return static_cast<T*>(p)->Fun(); }
// порождающая функция, чтобы не писать параметры шаблона рукамиtemplate<class R, class T, R(T::*Fun)>
THREADPROC make_runner(R(T::*Fun)()) { return runner<R,T,Fun>; }
<>
Извини, это на меня помрачение нашло. Невозможно аргумент функции (времени исполнения) превратить в параметр шаблона (времени компиляции).
Поэтому make_runner работать не будет, придётся явно писать runner<int,wacawaca,&wacawaca::Go>
Так что остаётся либо педалить код, либо использовать рантаймовые штуки — от boost::function до собственных легковесных.
А он и не плох. 1й вариант г-на Кодта это и есть модификация от Maxim Yegorushkin (с возвращаемым типом). Меня просто заинтересовала обертка., поэтому и вопрос возник.
Поосторожней там с волатитностью!. Эти коды вообще не годные. Нет гарантий что треад стартует сразу, за это время запускющий процесс может не то что стек потерять, а вообще закончится