Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > boost::thread + mem_fun


Автор: GoldFinch 4.8.2009, 22:55
есть интерфейс
Код

#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)"

Автор: GoldFinch 5.8.2009, 00:15
проблема была в __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 работает

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)