【问题标题】:What is the use of callback function in C++ ?C++中回调函数有什么用?
【发布时间】:2012-05-06 00:28:09
【问题描述】:

您好,我很想知道回调函数的用途。 谁能用一个简单的例子解释一下。

在我的项目中,我观察到某个特定的 CallBack 函数突然被调用堆栈中的某个函数调用,该函数显示为 User.dll!546383c()。

我真的很困惑谁在调用此回调以及何时发生。

调用堆栈看起来不错,直到某个点(即函数 A() 调用 B() 调用 C() 等......)突然发生了一些事情,User.dll 中的某个函数调用了这个回调。所以我失去了对功能的了解。

谁能举个例子解释一下。提前致谢。

【问题讨论】:

  • "User.dll!546383c()" - 您应该掌握系统的调试符号。获取模块窗口,然后右键单击 User32 并“加载符号”;您可能需要设置 Microsoft 符号服务器,但它应该随后下载它们。然后它将向您显示 User32 中的函数名称,这将使这一点更加明显。

标签: c++ c visual-c++ callback asynccallback


【解决方案1】:

您好,我很想知道回调函数的用途。谁能用一个简单的例子解释一下。

关于这个没什么好说的。回调是一些库或系统代码让客户端/应用程序代码处理事件的机制。例如,您可能有一个与以下相关的回调:

  • 某些计时器/警报到期
  • I/O 事件,例如完成对文件、网络、键盘/控制台等的读取或写入,甚至更改程序读取或写入的能力(基于缓冲区大小限制),或新连接/丢失连接
  • 完成一些异步处理(例如,另一个线程做一些计算)
  • 某些异步处理中出现意外错误
  • 有机会指导处于特定状态的某个进程(例如,决定是否接受特定客户端,之后调用方将断开连接或开始一些异步客户端处理)

为什么 user.dll 恰好给你一个回调——谁知道呢?您还没有告诉我们有关您的程序或它正在做什么的任何事情。

在逻辑级别上,回调实际上可能不会在您的线程中分派,直到您的线程检查(甚至可能阻塞等待)排队的消息,或者回调可能会中断您的线程正在执行的任何单独处理。当事件由 C++ 程序的其他部分创建时,前者很常见,后者常见于操作系统和硬件回调(例如 Linux/UNIX 上的“信号”)。

【讨论】:

    【解决方案2】:

    简单地说,回调就像函数指针,用于配置一个函数来报告(回调)应用程序中的另一个函数。 例如,使用这种方法,可以处理诸如按钮单击、鼠标移动、菜单选择以及内存中两个实体之间的一般双向通信等事件。

    因此触发回调的可能是用户输入或引发的任何其他通信事件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-16
      • 1970-01-01
      • 2013-10-21
      • 2014-02-23
      • 1970-01-01
      • 1970-01-01
      • 2012-04-23
      • 2012-08-21
      相关资源
      最近更新 更多