создать поток из ф-ии обьекта.
От: loknalori Россия  
Дата: 20.03.07 09:59
Оценка:
Есть класс, у него имеется несколько НЕ статических ф-й которые реализуют логику работы в потоке. Необходимо запустить их в пок.
Данный класс не отнаследован от потоковых классов. На текущий момент применяю след. технику:
CreateThread(..., Runner ,this,...);//вызов глобальной ф-и Run, которой через параметры передаю адрес поинтера на обьект класса.

DWORD WINAPI Runner (LPVOID par)
{reinterpret_cast<Some*> (par)->Do();}//Вот ф-я и в потоке.


Какие есть еще варианты? Этот не очень удобен хотябы тем что нужно плодить разные версии Runner для разных классов и методов...
Re: создать поток из ф-ии обьекта.
От: bkat  
Дата: 20.03.07 10:07
Оценка:
Здравствуйте, loknalori, Вы писали:

L>Какие есть еще варианты? Этот не очень удобен хотябы тем что нужно плодить разные версии Runner для разных классов и методов...


http://www.rsdn.ru/Forum/Info.aspx?name=FAQ.cpp.threadandmember
Автор: MaximE
Дата: 08.08.04
Re[2]: создать поток из ф-ии обьекта.
От: loknalori Россия  
Дата: 20.03.07 10:22
Оценка: :)
Здравствуйте, bkat, Вы писали:

B>Здравствуйте, loknalori, Вы писали:


L>>Какие есть еще варианты? Этот не очень удобен хотябы тем что нужно плодить разные версии Runner для разных классов и методов...


B>http://www.rsdn.ru/Forum/Info.aspx?name=FAQ.cpp.threadandmember
Автор: MaximE
Дата: 08.08.04


Скажите, вы иходное сообщение читали? В нем как раз и описан тот способ на который вы дали линк.
Re[3]: создать поток из ф-ии обьекта.
От: loknalori Россия  
Дата: 20.03.07 10:29
Оценка:
Здравствуйте, loknalori, Вы писали:

L>Скажите, вы иходное сообщение читали? В нем как раз и описан тот способ на который вы дали линк.

Упреждаю ответ. То что используется тимплейтовская оберка — суть дела не меняет.
Re[4]: создать поток из ф-ии обьекта.
От: bkat  
Дата: 20.03.07 10:33
Оценка:
Здравствуйте, loknalori, Вы писали:

L>Здравствуйте, loknalori, Вы писали:


L>>Скажите, вы иходное сообщение читали? В нем как раз и описан тот способ на который вы дали линк.

L>Упреждаю ответ. То что используется тимплейтовская оберка — суть дела не меняет.

Ну если ничего не меняет, то и не пользуй.
Хотя, на мой взгляд, как раз твою проблему с разными версиями Runner решает.
Re: создать поток из ф-ии обьекта.
От: Кодт Россия  
Дата: 20.03.07 12:12
Оценка: 1 (1)
Здравствуйте, 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>; }


Вариант два:
boost/thread + boost/bind
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[2]: создать поток из ф-ии обьекта.
От: loknalori Россия  
Дата: 21.03.07 08:37
Оценка:
Здравствуйте, Кодт, Вы писали:
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>; }


Что ему нехватает для вычисления парамтеров?
struct wacawaca
{
    int Go(){for(int i=0; i<100; i++){MessageBox(NULL,"ddd","cccc",MB_OK); Sleep(1000);}return 1;}
};
//skiped
make_runner(&wacawaca::Go);/*LPTHREAD_START_ROUTINE make_runner(R (__thiscall T::* )(void))' :
                             could not deduce template argument for 'Fun'*/
Re[3]: создать поток из ф-ии обьекта.
От: Кодт Россия  
Дата: 21.03.07 09:38
Оценка:
Здравствуйте, loknalori, Вы писали:

<>
Извини, это на меня помрачение нашло. Невозможно аргумент функции (времени исполнения) превратить в параметр шаблона (времени компиляции).
Поэтому make_runner работать не будет, придётся явно писать runner<int,wacawaca,&wacawaca::Go>

Так что остаётся либо педалить код, либо использовать рантаймовые штуки — от boost::function до собственных легковесных.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[3]: создать поток из ф-ии обьекта.
От: bkat  
Дата: 21.03.07 09:44
Оценка:
А все же, чем плох вариант от Maxim Yegorushkin?
http://www.rsdn.ru/Forum/Info.aspx?name=FAQ.cpp.threadandmember
Автор: MaximE
Дата: 08.08.04
Re[4]: создать поток из ф-ии обьекта.
От: loknalori Россия  
Дата: 21.03.07 10:04
Оценка:
Здравствуйте, bkat, Вы писали:

B>А все же, чем плох вариант от Maxim Yegorushkin?

B>http://www.rsdn.ru/Forum/Info.aspx?name=FAQ.cpp.threadandmember
Автор: MaximE
Дата: 08.08.04

А он и не плох. 1й вариант г-на Кодта это и есть модификация от Maxim Yegorushkin (с возвращаемым типом). Меня просто заинтересовала обертка., поэтому и вопрос возник.
Re[5]: создать поток из ф-ии обьекта.
От: Programador  
Дата: 21.03.07 11:09
Оценка:
Здравствуйте, loknalori,

Поосторожней там с волатитностью!. Эти коды вообще не годные. Нет гарантий что треад стартует сразу, за это время запускющий процесс может не то что стек потерять, а вообще закончится
Re[6]: создать поток из ф-ии обьекта.
От: Programador  
Дата: 21.03.07 11:24
Оценка:
Здравствуйте, loknalori,
Извините — не разобрался сразу
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.