回调函数的疑惑
问题背景:之前的一个项目有用到一款网络摄像机,其中需要调用摄像机SDK获取视频帧的BMP格式的数据,比如回调函数中会把帧数据写到一个全局的内存块。通过设置回调函数来获取帧数据。我发现只要在程序初始化中设置该回调函数,在后面的业务模块中只要是一个循环,我就能从内存块中提取出实时的帧数据,大致流程如下:
// 存放帧数据的数组
char data[1000];
// 回调函数,callback_fun由SDK提供
void callback_fun()
{
...
// 将帧数据写到一个全局数组data中
}
// 初始化工作,在程序一开始时执行
void init()
{
.......
// 设置回调函数,set_callback也是由SDK提供
int flag = set_callback(para1, para2, ..., callback_fun);
......
}
// 主要业务代码
void dowork()
{
while(true)
{
// 从数组data中取当前帧数据
}
}
问题:我在业务代码的循环语句中并没有明确地使用到调用函数,只是在初始化时调用过一次设置回调函数,为什么我从data中获得的是实时的帧数据?是不是set_callback隐藏地开了一个线程,在循环调用,实时地向data数组中写数据?如果是这样还有一个问题,一个线程往data中写数据,而我的业务代码中要读数据,这是一个读者写者问题,可我并没有加锁互斥,但在长时间运行的过程中程序并没有崩溃过和错误结果的现象,这又是为什么?
分不多,还是希望各位大神能回答。
// 存放帧数据的数组
char data[1000];
// 回调函数,callback_fun由SDK提供
void callback_fun()
{
...
// 将帧数据写到一个全局数组data中
}
// 初始化工作,在程序一开始时执行
void init()
{
.......
// 设置回调函数,set_callback也是由SDK提供
int flag = set_callback(para1, para2, ..., callback_fun);
......
}
// 主要业务代码
void dowork()
{
while(true)
{
// 从数组data中取当前帧数据
}
}
问题:我在业务代码的循环语句中并没有明确地使用到调用函数,只是在初始化时调用过一次设置回调函数,为什么我从data中获得的是实时的帧数据?是不是set_callback隐藏地开了一个线程,在循环调用,实时地向data数组中写数据?如果是这样还有一个问题,一个线程往data中写数据,而我的业务代码中要读数据,这是一个读者写者问题,可我并没有加锁互斥,但在长时间运行的过程中程序并没有崩溃过和错误结果的现象,这又是为什么?
分不多,还是希望各位大神能回答。
...全文
相关推荐
Doubt
Doubt
jquery.blockUI.js上传滚动等待效果实现思路及代码
请求的url: 代码如下: function request(url, onSuccess, paras, method, isAsync, isMask) { $.ajax({type:method,url:url,async:isAsync,data:paras,success:function(request){onSuccess(request,isMask);},error:function(e) {if(isMask) $(‘#div_mask’).unblock();},beforeSend:function(e){if(isMask)$(‘#div_mask’).block(
疑惑的近义词.docx
疑惑的近义词.docx
mfc下实现回调函数
程序实现了在mfc下如何定义一个回调函数,如何使用回调函数,以及如何把类指针传递递给用户回调函数的例程。
C语言 回调函数详解
我们在使用C语言实现相对复杂的软件开发时,经常会碰到使用回调函数的问题。但是回调函数的理解和使用却不是一件简单的事,在本篇我们根据我们个人的理解和应用经验对回调函数做简要的分析。 1、什么是回调函数 既然谈到了回调函数,首先我们就要搞清楚什么是回调函数。在讨论回调函数之前,我们需要说明另一个概念,那就是函数指针。什么是函数指针呢?说的浅显一点,函数指针就是指向函数的指针,说白了也是一种指针,只是它指向的不是整型,字符型等数据量,而是指向函数。在C中,每个函数在编译后都是存储在内存中,并且每个函数都有一个入口地址,根据这个地址,我们便可以访问并使用这个函数。函数指针就是指向这个入口地址,从而


模式及实现
