帖子

目前显示的是 二月, 2014的博文

关于Interface和Callback的一些杂记

Java中有一个名为interface的关键字用于定义接口类 ,"an interface is a group of related methods with empty bodies"C++中没有这个关键字,但是对于只含有纯虚函数的C++类来说,它和Java中的Interface也差不多。interface常被用来实现callback。比如我们正在写一个http服务器,它每收到一个http请求就去执行一些特定的代码。为了把基础框架和应用层代码分开,callback就是很好的模式。C语言中既没有类也没有虚函数,所以在C的函数库中,callback通常用一个函数指针加一个void*来实现。那个void*可以被用来传递任意句柄。通常来说,我把那个void*就看成是this指针。C++中实现functor的三种方式:函数指针 + void*struct/class重载operator()lambda表达式这三种都可以统一被转换成std::function。callback有时会让C/C++的内存管理变得很复杂。如果能做到谁分配谁释放,那么内存管理就再简单不过了。但是常常并非如此。假设我们有一个事件(event)管理器,它有一个事件循环,每当收到一个新事件,就去调用这个事件对应的callback。但是我们的程序又是多线程的,所以这个事件管理器本身必须被锁保护。那么就存在一个问题,callback执行的时候,应处于临界区内还是外?即,此时该线程是否持有事件管理器内的锁? 答案通常是"不",为了避免死锁。就算没有死锁,在这种情况下是否依然能触发并处理新事件?非常复杂。如果callback执行的时候并不拥有事件管理器的任何锁,但是它又要访问事件管理器,那么就存在一个问题:如何维护事件管理器的生命周期?如果我在本次事件处理中调用了事件管理器的shutdown方法呢?这时就得靠引用计数来解决问题。事件管理器内部得有一个引用计数器。初始值为1。每调用一次callback之前加1,完成之后减1。this->ref++;
this->unlock();
do_callbacks(.....);
this->lock();
this->ref--;
if(!this->ref) delete this;API: base cl…

How to download the CBS news videos

视频的url:在这个网站http://www.cbsnews.com/上能在线观看CBS的视频节目,比如Evening News, 60 minutes, Face the Nation等等。随便打开一个视频节目的播放页,然后打开网页源代码,搜索mp4,就能看到这样的东西{"pid":"ZqQdf4uXVkZE","bitrate":764000,"uri":"rtmp://cp98363.edgefcs.net/ondemand/?auth=cbs&aifp=v001&slist=media/2014/01/05/107395139598/<break>media/2014/01/05/107395139598/ftn_0105_NEWfull_796.mp4"},"tablet":{"pid":"tv78ObYUA_eM","bitrate":740000,"uri":"http://download.cbsnews.com/media/mpx/2014/01/05/107395139598/ftn_0105_NEWfull_740.mp4"},"mobile":{"pid":"S8jlI1_h4UwZ","bitrate":240000,"uri":"http://download.cbsnews.com/media/mpx/2014/01/05/107395139598/ftn_0105_NEWfull_240.mp4"} 它对应的是一个视频的不同格式。其中740.mp4和796.mp4是分辨率最高的,分辨率是640x360。这两个文件基本一样,区别是796.mp4的音频是48khz的,而740.mp4是22khz的。域名都是download.cbsnews.com,只是后面的网址略有区别。如:http://download.cbsnews.com/media/2014/02/09/144224…