【问题标题】:C++ Multiple Callback functionsC++ 多个回调函数
【发布时间】:2011-03-17 18:49:52
【问题描述】:

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

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

任何可能的解决方案?

【问题讨论】:

  • 如果无法传递上下文参数,那么您就不走运了。也许image* 参数携带了一些可以用来识别上下文的数据?

标签: c++ class pointers object callback


【解决方案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 函数。

【讨论】:

  • 感谢您的回复,这对我不起作用。这样所有相机都将接收到所有相机的所有图像!我需要每台相机只获取它自己的图像。
【解决方案2】:

根据操作系统,您可以为每个回调对象创建动态函数。对于没有任何工具将值传递给回调的遗留代码的回调,我已经做到了这一点。

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

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

编译它并查看程序集的十六进制。常数在哪里应该很明显。

然后您使用 VirtualAlloc + PAGE_EXECUTE_READWRITE 或 mmap + PROT_EXEC 来分配一些可以执行的内存。分配通常以 4K 块为单位,因此请创建一个类来管理这些功能,因为您一次就可以为许多块分配足够的空间。

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

【讨论】:

    【解决方案3】:

    相机 SDK 是否支持多相机连接?如果没有,您需要与 SDK 提供者联系。

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

    无效回调0(图像*); 无效回调1(图像*); 订阅图像回调(0,回调0); // 摄像机 0 订阅图像回调(1,回调1); // 摄像机 1

    您问题的实际答案取决于相机 SDK 接口。

    【讨论】:

    • 非常感谢您的回答。识别相机 ID 的唯一可能方法是从图像的内存地址。但它会解决问题:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-04-29
    • 2018-09-17
    相关资源
    最近更新 更多