C ++多个回调函数

时间:2010-07-19 07:19:07

标签: c++ class pointers object callback

我有一个dll需要我为它设置一个回调函数(实际上它是一个摄像头sdk,它会在收到图片时回调我的函数)。 我想拥有多个(用户输入)相机,但我不能。 因为我应该使用未知数量的回调函数。

简单的方法是创建一个具有回调函数的类(相机)。 但我无法将类成员的指针传递给dll(它只接受(void)(image *))

任何可能的解决方案?

3 个答案:

答案 0 :(得分:1)

尝试创建要调用的所有函数对象的全局列表,然后添加一个函数,该函数使用所需数据调用每个回调。像这样:

std::vector<ICallback*> g_callbacks;

void callback_wrapper( image * image )
{
  for(unsigned int i=0; i<g_callbacks.size(); ++i)
  {
     g_callbacks[i]->process( image );
  }
}

然后将SDK使用的回调设置为callback_wrapper函数。

答案 1 :(得分:0)

相机SDK是否支持多个相机连接?如果没有,您需要与SDK提供商交谈。

如果SDK支持多重连接,则必须提供在回调函数中识别摄像头的方法。但实际的答案是在SDK本身。什么是“图像”类型,也许它包含摄像机ID?当客户端代码进行回调订阅时,可能会提供相机ID?像这样:

void Callback0(image*);
void Callback1(image*);

SubscribeImageCallback(0, Callback0);  // camera 0
SubscribeImageCallback(1, Callback1);  // camera 1

您问题的实际答案取决于相机SDK界面。

答案 2 :(得分:0)

根据操作系统的不同,您可以为每个回调对象创建动态函数。我已经完成了遗留代码的回调,它没有任何设施将值传递给回调。

使用库所期望的类型创建一个小型原型转发函数,然后使用一个容易看到的额外参数调用真实的回调函数

void Call01020304 () {
    CallWithValue(0x01020304);
}

编译它并查看程序集的十六进制。这个常数应该是显而易见的。

然后使用VirtualAlloc + PAGE_EXECUTE_READWRITE或mmap + PROT_EXEC分配一些可以执行的内存。分配通常是4K块,因此创建一个类来管理这些功能,因为你将为一次性分配足够的数量。

当您需要具有唯一值的新回调函数时,将具有适当更改值的原型的字节复制到可执行内存中,并将指针作为回调函数返回给它。