在过去,我使用了允许我注册回调的库,以便库可以在某些事件发生时调用我的方法(例如,在使用GUI库看起来像{{1}的代码中常见}})。
天真地,我认为图书馆的处理机制可以实现如下:
button.onClick(clickHandler)
但这真的很浪费吗?或者它是如何完成的(例如像java swing这样众所周知的GUI库,或GTK +这样做)?
背景
在我遇到curses之前,这个问题并没有发生在我身上。我想到实现自己的回调系统,直到我意识到我不知道如何。
答案 0 :(得分:2)
while循环通常会等待用户的中断(Windows中的GetMessage)。当中断到达时GetMessage返回,然后它在回调函数中结束。 if语句通常实现为switch-case。请参阅Wikipedia上的Windows消息循环。
更详细地说,会发生以下情况:
用户应用程序调用GetMessage,它强制进程休眠,直到该应用程序的输入消息从系统队列到达。当消息到达时,用户应用程序调用DispatchMessage,它调用与消息所针对的窗口相关联的回调函数。
Windows API使用一个回调来处理交换机案例中的所有事件。其他库每个事件类使用一个回调。
函数指针本身与其他窗口数据一起存储在结构中。
答案 1 :(得分:0)
回调系统实现可能在不同的技术中有不同的实现,但是,我想他们应该这样工作:
数据结构存储回调ID和指向处理程序的指针。
回调处理程序具有验证程序
事件处理程序有回调调用程序,它知道可能的回调是什么,并以这种方式检查它们的有效性:
对于event.callbacks中的每个回调
if (callback.isValid())
call callback()
end if
结束
当您向函数添加处理程序时,系统将自动知道回调的有效位置,并将回调添加到1中描述的数据结构。
如果我错了,请纠正我,这个描述只是猜测。