在Learning OpenCV
一书中,我来到了术语callback
,有时与routine
一起用作callback routine
。
当我们说callback
时,我们的意思是什么?
感谢。
答案 0 :(得分:15)
什么是回拨功能?
简单来说,回调函数是程序员未明确调用的函数。相反,有一些机制不断等待事件发生,它会调用选定的函数来响应特定的事件
当操作(函数)花费很长时间执行并且函数的调用者不想等到操作完成但是希望暗示操作的结果时,通常使用该机制。通常,回调函数有助于实现这样的 异步机制 ,其中调用者注册以获取关于耗时处理和连续其他操作的结果的动画,而在稍后的时间点时间,来电者得知结果。
一个实际例子:
Windows事件处理:
几乎所有的Windows程序都设置了一个事件循环,使程序通过调用函数来响应特定事件(例如按下按钮,选中一个复选框,窗口获得焦点)。方便的是,程序员可以指定在按下特定按钮时调用哪个函数,即使无法指定何时按下按钮。被调用的函数称为回调。
源代码插图:
//warning: Mind compiled code, intended to illustrate the mechanism
#include <map>
typedef void (*Callback)();
std::map<int, Callback> callback_map;
void RegisterCallback(int event, Callback function)
{
callback_map[event] = function;
}
bool finished = false;
int GetNextEvent()
{
static int i = 0;
++i;
if (i == 5) finished = false;
}
void EventProcessor()
{
int event;
while (!finished)
{
event = GetNextEvent();
std::map<int, Callback>::const_iterator it = callback_map.find(event);
if (it != callback_map.end()) // if a callback is registered for event
{
Callback function = *it;
if (function)
{
(*function)();
}
else
{
std::cout << "No callback found\n";
}
}
}
}
void Cat()
{
std::cout << "Cat\n";
}
void Dog()
{
std::cout << "Dog\n";
}
void Bird()
{
std::cout << "Bird\n";
}
int main()
{
RegisterCallBack(1, Cat);
RegisterCallback(2, Dog);
RegisterCallback(3, Cat);
RegisterCallback(4, Bird);
RegisterCallback(5, Cat);
EventProcessor();
return 0;
}
以上将输出以下内容:
Cat
Dog
Cat
Bird
Cat
希望这有帮助!
注意:
从我的旧答案 here 中导入此答案。
答案 1 :(得分:6)
“我不是自己打电话,但系统(或其他一些人)会称之为”。这是回调。
答案 2 :(得分:3)
它们意味着您将指向程序的指针传递给OpenCV
。当事情发生时,这将是called back
。这可以是例如见cvSetMouseCallback()
。只要鼠标移动,就会调用指针引用的函数。
答案 3 :(得分:2)
“Routine”在此上下文中与“function”相同。该术语可以追溯到较旧的语言(如Fortran),这些语言在函数之间产生差异,返回值,而(子)例程则不然。
“回调”是一种技术,您可以在其中提供指向系统/ API /框架的一个函数(“例程”)的指针,系统/ API /框架会在感觉到这样做时将其调回。因此,回调例程或简单的回调是一种用于此类用途的函数。
在严格的对象语言(如Java)中,他们通常使用侦听器和委托。回调技术以其C ++形式,具有与非面向对象语言(如经典C)兼容的优势。
编辑:在Microsoft C运行时库中,此技术用于qsort()函数。 compare
参数是指向回调例程的函数指针。只要需要比较两个数组元素,RTL就会调用它。这不是一个典型的例子'因为compare
的所有调用都发生在qsort()调用返回之前。
在Win32 API中,回调是主要内容。窗口过程是一个主要示例 - 您在WNDCLASS结构中传递指向它的指针,系统在消息到达时调用该过程。在这种情况下,回调例程在RegisterClass()之后很久就被调用 - 在窗口的整个生命周期内。
在POSIX / Unix / Linux中,信号处理功能就是一个例子。请参阅signal()系统调用说明。
答案 4 :(得分:1)
遵循Holywood原则“不要打电话给我们,我们称呼你”,回调是对函数的引用,该函数被传递给另一个函数。
回调将由它给出的函数调用,例如当数据可用或需要执行某些处理步骤时。
答案 5 :(得分:0)
回调函数是未明确调用的函数,这些函数在某些事件发生后自动调用,例如在按下&#34; ctrl + c&#34;生成的SIGINT信号自动处理程序将执行。