在Learning OpenCV这本书中,我提到了callback这个术语,有时候它和routine一起用作callback routine。我们说callback是什么意思?谢谢.
Learning OpenCV
callback
routine
callback routine
o7jaxewo1#
简单来说,回调函数就是程序员不显式调用的函数,而是有某种机制不断等待事件的发生,它会调用选定的函数来响应特定的事件。此机制通常在操作(函数)需要很长的执行时间,函数的调用者不想等到操作完成,但希望被告知操作的结果。通常,回调函数有助于实现这样的异步机制 *,其中,调用者注册以获得关于耗时处理的结果的初始化,并且继续其它操作,而在稍后的时间点,调用者得到关于结果的通知。
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
型希望这对你有帮助!注意事项:从我以前的一个答案中导入了这个答案在这里。
bxgwgixi2#
“我不会自己调用它,但系统(或其他人)会调用它”。这就是 callback。
9rbhqvlz3#
这意味着你传递一个指向过程的指针给OpenCV。当发生某些事情时,这将是called back。这可以在cvSetMouseCallback()中看到。每当鼠标移动时,指针引用的函数将被调用。
OpenCV
called back
cvSetMouseCallback()
vlf7wbxs4#
遵循霍利伍德原则“不要打电话给我们,我们打电话给你”,回调是对一个函数的引用,它被传递给另一个函数。回调将由它所赋予的函数调用,例如当数据可用或需要执行某些处理步骤时。
6za6bjd05#
“例程”在这个上下文中与“函数”相同。这个术语可以追溯到更古老的语言(如Fortran),它们区分了函数(返回值)和(子)例程(不返回值)。“回调”是一种技术,你提供一个指向你的函数(“例程”)的指针给系统/API/框架,系统/API/框架会在它想这样做的时候调用它。所以一个回调例程,或者简单地说一个回调,是一个用于这种用途的函数。在严格的对象语言(如Java)中,它们通常使用侦听器和委托来实现这一点。C++形式的回调技术的优点是它与经典C等非面向对象语言兼容。编辑:在Microsoft C运行时库中,此技术用于qsort()函数。compare参数是指向回调例程的函数指针。每当需要比较两个数组元素时,RTL都会调用它。这不是一个典型的例子,因为所有对compare的调用都发生在qsort()调用返回之前。在Win32 API中,回调函数是一个重要的组成部分。窗口过程就是一个很好的例子--你在WNDCLASS结构中传递一个指向它的指针,系统在消息到达时回调该过程。在这种情况下,回调例程在RegisterClass()之后很久才被调用--在窗口的整个生命周期内。在POSIX/Unix/Linux中,信号处理函数就是一个例子。参见signal()系统调用描述。
compare
aor9mmx16#
回调函数是没有被显式调用的函数,这种函数在某些事件发生后自动调用,例如在按下“c +c”后生成SIGINT信号,因此处理程序将自动执行。
6条答案
按热度按时间o7jaxewo1#
简单来说,回调函数就是程序员不显式调用的函数,而是有某种机制不断等待事件的发生,它会调用选定的函数来响应特定的事件。
此机制通常在操作(函数)需要很长的执行时间,函数的调用者不想等到操作完成,但希望被告知操作的结果。通常,回调函数有助于实现这样的异步机制 *,其中,调用者注册以获得关于耗时处理的结果的初始化,并且继续其它操作,而在稍后的时间点,调用者得到关于结果的通知。
Windows事件处理:
实际上所有的windows程序都建立了一个事件循环,使程序响应特定的事件。(例如按钮按下,选择复选框,窗口获得焦点)通过调用函数。方便的是,程序员可以指定当(比如)按下特定按钮时调用什么函数,即使无法指定何时按下按钮。被调用的函数称为回调。
字符串
以上将输出以下内容:
型
希望这对你有帮助!
注意事项:
从我以前的一个答案中导入了这个答案在这里。
bxgwgixi2#
“我不会自己调用它,但系统(或其他人)会调用它”。这就是 callback。
9rbhqvlz3#
这意味着你传递一个指向过程的指针给
OpenCV
。当发生某些事情时,这将是called back
。这可以在cvSetMouseCallback()
中看到。每当鼠标移动时,指针引用的函数将被调用。vlf7wbxs4#
遵循霍利伍德原则“不要打电话给我们,我们打电话给你”,回调是对一个函数的引用,它被传递给另一个函数。
回调将由它所赋予的函数调用,例如当数据可用或需要执行某些处理步骤时。
6za6bjd05#
“例程”在这个上下文中与“函数”相同。这个术语可以追溯到更古老的语言(如Fortran),它们区分了函数(返回值)和(子)例程(不返回值)。
“回调”是一种技术,你提供一个指向你的函数(“例程”)的指针给系统/API/框架,系统/API/框架会在它想这样做的时候调用它。所以一个回调例程,或者简单地说一个回调,是一个用于这种用途的函数。
在严格的对象语言(如Java)中,它们通常使用侦听器和委托来实现这一点。C++形式的回调技术的优点是它与经典C等非面向对象语言兼容。
编辑:在Microsoft C运行时库中,此技术用于qsort()函数。
compare
参数是指向回调例程的函数指针。每当需要比较两个数组元素时,RTL都会调用它。这不是一个典型的例子,因为所有对compare
的调用都发生在qsort()调用返回之前。在Win32 API中,回调函数是一个重要的组成部分。窗口过程就是一个很好的例子--你在WNDCLASS结构中传递一个指向它的指针,系统在消息到达时回调该过程。在这种情况下,回调例程在RegisterClass()之后很久才被调用--在窗口的整个生命周期内。
在POSIX/Unix/Linux中,信号处理函数就是一个例子。参见signal()系统调用描述。
aor9mmx16#
回调函数是没有被显式调用的函数,这种函数在某些事件发生后自动调用,例如在按下“c +c”后生成SIGINT信号,因此处理程序将自动执行。