Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> boost::thread + mem_fun 
V
    Опции темы
GoldFinch
Дата 4.8.2009, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



есть интерфейс
Код

#define CALL  __stdcall
...

class HGE
{
public:
...
    virtual bool        CALL    System_Start() = 0;

и есть указатель HGE* hge;
надо запустить hge->System_Start() в отдельном потоке

следующий код работает нормально
Код

    struct ViewThread
    {
        void operator()(HGE* hge) {    hge->System_Start();    }
    } f;
    boost::thread viewThread(f,hge);


пробую избавиться от явного функтора
Код

#define BOOST_MEM_FN_ENABLE_STDCALL
#include <boost/mem_fn.hpp>
#include <boost/bind.hpp>
#include <functional>

    boost::thread viewThread(
        boost::mem_fn( &HGE::System_Start ),
//        boost::bind( &HGE::System_Start, _1 ),
//        std::mem_fun( &HGE::System_Start ),
        hge
        );

варианты с boost::mem_fn и boost::bind валят компилятор о_О
Код

e:\_abyx\boost_1_39_0\boost\bind\mem_fn.hpp(342) : fatal error C1001: Внутренняя ошибка в файле компилятора.
(файл компилятора "msc1.cpp", строка 1411)

а вариант с std::mem_fun не компилится с ошибкой
Код

error C2784: std::const_mem_fun1_t<_Result,_Ty,_Arg> std::mem_fun(_Result (__thiscall _Ty::* )(_Arg) const): не удалось вывести аргумент шаблон для "_Result (__thiscall _Ty::* )(_Arg) const" из "bool (__stdcall HGE::* )(void)"

PM MAIL ICQ   Вверх
GoldFinch
Дата 5.8.2009, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



проблема была в __stdcall
написание своего адаптера "решило" проблему
Код

template <class S, class T>
class stdcall_mem_fun_t : public std::unary_function<T*, S>
{
public:
    explicit stdcall_mem_fun_t(S (__stdcall T::*p)()) : ptr(p) {}
    S operator()(T* p) const {    return (p->*ptr)(); }
private:
    S (__stdcall T::*ptr)();
};
template<class S, class T>
inline stdcall_mem_fun_t<S,T> stdcall_mem_fun(S (__stdcall T::*f)())
{
    return stdcall_mem_fun_t<S,T>(f);
}

boost::thread viewThread(
        stdcall_mem_fun( &HGE::System_Start ),
        hge
        );


Добавлено через 11 минут и 37 секунд
нет) проблема была в #define BOOST_MEM_FN_ENABLE_STDCALL
его надо было воткнуть до всех инклудов

тогда вариант с boost::mem_fn работает
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0419 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.