C++ callback
От: Аноним  
Дата: 08.04.11 09:42
Оценка:
Привет всем
какие идеии
каким образом передать фунцию класса как callback
Статический метод не подходит так как надо делаять различие между обектами а callback эту информацию не представляет
Re: C++ callback
От: Anpek  
Дата: 08.04.11 09:44
Оценка: 1 (1)
Здравствуйте, Аноним, Вы писали:
Сделать чисто виртуальный класс с одной этой функцией, твой класс отнаследовать от этого виртуального, переопределить эту функецию, и тому, кому нужен этот Callback давать указатель на этот вирутальный класс
Re[2]: C++ callback
От: Аноним  
Дата: 08.04.11 09:53
Оценка:
Здравствуйте, Anpek, Вы писали:

A>Здравствуйте, Аноним, Вы писали:

A>Сделать чисто виртуальный класс с одной этой функцией, твой класс отнаследовать от этого виртуального, переопределить эту функецию, и тому, кому нужен этот Callback давать указатель на этот вирутальный класс


наверное плохо поставил проблему

typedef struct{
BYTE m_bRemoteChannel;
BYTE m_bSendMode;
BYTE m_nImgFormat; // =0 cif ; = 1 qcif
char *m_sIPAddress;
char *m_sUserName;
char *m_sUserPassword;
BOOL m_bUserCheck;
HWND m_hShowVideo;
}CLIENT_VIDEOINFO, *PCLIENT_VIDEOINFO;


ReadDataCallBack(DWORD nPort, UCHAR *pPacketBuffer, DWORD nPacketSize);

MP4_ClientStart(&m_SClientVideoInfo, ReadDataCallBack);

это все пересылается в dll

как это связять с virtual
Re: C++ callback
От: night beast СССР  
Дата: 08.04.11 10:38
Оценка:
Здравствуйте, Аноним, Вы писали:

struct test {
  void foo() { std::cout << "foo"; }
};

template<typename F, F fn, typename T>
void bar( T * ptr ) { (ptr->*fn)(); }

int main () {
  test x;
  bar< void (test::*)(), &test::foo >(&x);
}
Re: C++ callback
От: Мишень-сан  
Дата: 08.04.11 10:43
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Привет всем

А>какие идеии
А>каким образом передать фунцию класса как callback
А>Статический метод не подходит так как надо делаять различие между обектами а callback эту информацию не представляет

В случае с полностью рантайм-логикой — никак, т.к. все методы инстанса какого-либо класса имеют один неявный параметр, в который передаётся указатель на инстанс класса. Фактически — это и есть this.
Re: C++ callback
От: sumkincpp
Дата: 08.04.11 10:45
Оценка:
Здравствуйте, Аноним, Вы писали:

> какие идеии

> каким образом передать фунцию класса как callback
> Статический метод не подходит так как надо делаять различие между обектами а callback эту информацию не представляет

Можно попробовать сделать обычный класс Function и переопределить другие дочерние классы типа GenericFunction.

Вот один из примеров реализации GenericFunction с IBM blogs. Не спрашивайте откуда, но как-то недавно набрел, сохранил в закладки, ибо известный подход "обёртки".
avalon 1.0rc3 rev 380, zlib 1.2.5
Re[3]: C++ callback
От: XuMuK Россия  
Дата: 08.04.11 10:57
Оценка: 3 (1)
Здравствуйте, Аноним, Вы писали:

В случае реализации callback, безотносительно длл, использовать нормальные функторы:

boost::function<void ()> f = boost::bind(&MyClass::Function, &my_class_object);
SetCallback(f);


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


A>>Здравствуйте, Аноним, Вы писали:

A>>Сделать чисто виртуальный класс с одной этой функцией, твой класс отнаследовать от этого виртуального, переопределить эту функецию, и тому, кому нужен этот Callback давать указатель на этот вирутальный класс


А>наверное плохо поставил проблему


А>typedef struct{

А> BYTE m_bRemoteChannel;
А> BYTE m_bSendMode;
А> BYTE m_nImgFormat; // =0 cif ; = 1 qcif
А> char *m_sIPAddress;
А> char *m_sUserName;
А> char *m_sUserPassword;
А> BOOL m_bUserCheck;
А> HWND m_hShowVideo;
А>}CLIENT_VIDEOINFO, *PCLIENT_VIDEOINFO;


А>ReadDataCallBack(DWORD nPort, UCHAR *pPacketBuffer, DWORD nPacketSize);


А>MP4_ClientStart(&m_SClientVideoInfo, ReadDataCallBack);


А>это все пересылается в dll


А>как это связять с virtual


тут все серьёзнее, т.к. нельзя менять интерфейс длл, можно выкрутится например так (главное учесть все возможные грабли, начиная от инициализации статических объектов и заканчивая потокобезопасностью):

/// h file:
void SetDataHadler(MyDataHandlerPtr* p);
void ReadDataCallBackImpl(DWORD nPort, UCHAR *pPacketBuffer, DWORD nPacketSize);

/// cpp file:
static MyDataHandlerPtr* _global_data_handler = 0;
void SetDataHadler(MyDataHandlerPtr* p)
{
  _global_data_handler = p;
}
void ReadDataCallBackImpl(DWORD nPort, UCHAR *pPacketBuffer, DWORD nPacketSize)
{
  assert(_global_data_handler);
  _global_data_handler->Process(nPort, pPacketBuffer, nPacketSize);
}
Re: C++ callback
От: Аноним  
Дата: 08.04.11 12:31
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Привет всем

А>какие идеии
А>каким образом передать фунцию класса как callback
А>Статический метод не подходит так как надо делаять различие между обектами а callback эту информацию не представляет
В данном случае
Автор:
Дата: 08.04.11
callback повесить на класс никак не получится, разве что разные классы будут под разные порты (nPort) и тогда вручную вызывать их колбэки.
Re[3]: C++ callback
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 08.04.11 12:35
Оценка: +2
Здравствуйте, <Аноним>, Вы писали:

А>ReadDataCallBack(DWORD nPort, UCHAR *pPacketBuffer, DWORD nPacketSize);

А>MP4_ClientStart(&m_SClientVideoInfo, ReadDataCallBack);

Вообще, callback-функции принято снабжать параметром контекста, передавая его вместе с адресом функции в вызывающую библиотеку/подсистему, а она при вызове функции передает ей в числе прочих этот параметр. Таким образом callback-функция может привязаться к некоторому набору данных, в роли которого часто выступает объект класса, а в параметре контекста передается значение this.

Возможно, в Вашем случае роль контекста играет параметр nPort, и к нему можно как-то привязать адрес объекта. Ведь callback-функция вызывается не в вакууме — она должна как-то сообразить, где взять нужные данные, или что делать с переданными данными. Очевидно, параметр nPort как-то описывает "порт", "канал" или что-то в этом роде, а там уже хранится информация о контексте и состоянии.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: C++ callback
От: andrey.desman  
Дата: 09.04.11 13:42
Оценка:
Здравствуйте, XuMuK, Вы писали:

XMK>тут все серьёзнее, т.к. нельзя менять интерфейс длл, можно выкрутится например так (главное учесть все возможные грабли, начиная от инициализации статических объектов и заканчивая потокобезопасностью):


XMK>
XMK>/// h file:
XMK>void SetDataHadler(MyDataHandlerPtr* p);
XMK>void ReadDataCallBackImpl(DWORD nPort, UCHAR *pPacketBuffer, DWORD nPacketSize);

XMK>/// cpp file:
XMK>static MyDataHandlerPtr* _global_data_handler = 0;
XMK>void SetDataHadler(MyDataHandlerPtr* p)
XMK>{
XMK>  _global_data_handler = p;
XMK>}
XMK>void ReadDataCallBackImpl(DWORD nPort, UCHAR *pPacketBuffer, DWORD nPacketSize)
XMK>{
XMK>  assert(_global_data_handler);
XMK>  _global_data_handler->Process(nPort, pPacketBuffer, nPacketSize);
XMK>}
XMK>


Тут наверное больше подойдет std::map<DWORD /*nPort*/, boost::shared_ptr<MyDataHandler> >
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.