2010-07-19 149 views
0

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

简单的方法是制作一个类(相机),它有一个回调函数。 但我不能通过类的成员的指针到DLL(它只接受(void)(image *))

任何可能的解决方案?

+0

没有可能通过上下文参数,你是运气不好。也许'image *'参数携带一些可用于识别上下文的数据? – 2010-07-19 07:45:33

回答

0

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

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

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

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

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

+0

非常感谢你的回答。 识别相机ID的唯一可能方法是从图像的内存地址。但它会解决问题:) – MBZ 2010-07-19 08:34:34

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函数。

+0

感谢您的回复,这不会为我工作。 这样所有的相机都会收到所有相机的所有图像! 我需要每台相机才能得到它自己的图像。 – MBZ 2010-07-19 07:36:25

0

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

创建与库的预期,其类型,然后用一个容易看到额外的参数

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

编译它,并期待在16进制,大会呼吁真正的回调函数小样机转发功能。这应该是显而易见的常数。

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

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