第二部分 程序框架实现的线程分析
2013-04-09 01:11
288 查看
1. 播放列表文件src/playlist/playlist.c的线程
playlist_t * __playlist_Create ( vlc_object_t *p_parent )函数中创建的线程,线程函数为
static void RunThread ( playlist_t *p_playlist )
线程思路分析:
在RunThread里面执行循环,如果没有任务执行,则适当的延迟,如果接到p_playlist->i_status != PLAYLIST_STOPPED的条件,则调用PlayItem( p_playlist )函数,在PlayItem( p_playlist )函数中从新创建输入线程。
通过void playlist_Command( playlist_t * p_playlist, playlist_command_t i_command,int i_arg )接收来自GUI界面的各种命令,然后设置p_playlist->i_status的状态,由该状态改变该播放列表文件主循环线程的执行。
2. 输入文件SRC/INPUT/INPUT.C的输入线程
input_thread_t *__input_CreateThread( vlc_object_t *p_parent,
input_item_t *p_item )函数中创建的线程,线程函数为
static int RunThread( input_thread_t *p_input )
线程思路分析:
由 input_thread_t结构的成员分析是接收文件流还是网络流,如果是文件流,则调用file module 的读函数(pf_read)和打开函数(--).如果是network 则打开network module 的打开函数和读函数(pf_read)。
在 RunThread线程函数中接收数据和调用demux 或者decode etc处理。
一旦产生新的输入,则在播放列表线程中会首先结束该输入线程,然后从新创建新的输入线程。
3. 视频输出文件src/video_output/ video_output.c的线程
vout_thread_t * __vout_Create( vlc_object_t *p_parent,
unsigned int i_width, unsigned int i_height,
vlc_fourcc_t i_chroma, unsigned int i_aspect )函数中创建的线程,线程函数为
static void RunThread( vout_thread_t *p_vout)
线程思路分析:
在RunThread里面执行循环,任务是显示视频。
4. 在modules\gui\wxwindows\wxwindows.cpp中的GUI线程
static void Run( intf_thread_t *p_intf ) 函数中创建的线程,线程函数为
static void Init( intf_thread_t *p_intf )
线程思路分析:
在Init( intf_thread_t *p_intf )里面执行循环,创建新的GUI实例。Instance-》OnInit()(CreateDialogsProvider)-》DialogsProvider为运行的对话框。
接收网络文件的步骤
OnOpenNet( wxCommandEvent& event )打开网络文件的步骤。打开OpenDialog对话框,点击Ok后调用OpenDialog::OnOk( wxCommandEvent& WXUNUSED(event) )函数,调用playlist_Command函数改变播放列表线程的状态。
激活线程分析:
在wxwindow.cpp中的消息映射中 set_callbacks( OpenDialogs, Close ); 则设置了module_t->pf_activate= OpenDialogs函数,
在module.c 的__module_Need( vlc_object_t *p_this, const char *psz_capability,
const char *psz_name, vlc_bool_t b_strict )
函数中用到了pf_activate激活GUI对话框;
在video_output.c 的static void RunThread( vout_thread_t *p_vout)线程中,也用到了pf_activate激活GUI对话框;
5. 开始所有module 的精髓
消息映射宏
vlc_module_begin();
set_callbacks( NetOpen, NULL );
vlc_module_end();
然后设置模块结构的成员函数为:
#define set_callbacks( activate, deactivate ) \
p_submodule->pf_activate = activate; \
p_submodule->pf_deactivate = deactivate
在__module_Need函数中启动pf_activate 激活相应的module。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jsphuang/archive/2005/01/27/271133.aspx
playlist_t * __playlist_Create ( vlc_object_t *p_parent )函数中创建的线程,线程函数为
static void RunThread ( playlist_t *p_playlist )
线程思路分析:
在RunThread里面执行循环,如果没有任务执行,则适当的延迟,如果接到p_playlist->i_status != PLAYLIST_STOPPED的条件,则调用PlayItem( p_playlist )函数,在PlayItem( p_playlist )函数中从新创建输入线程。
通过void playlist_Command( playlist_t * p_playlist, playlist_command_t i_command,int i_arg )接收来自GUI界面的各种命令,然后设置p_playlist->i_status的状态,由该状态改变该播放列表文件主循环线程的执行。
2. 输入文件SRC/INPUT/INPUT.C的输入线程
input_thread_t *__input_CreateThread( vlc_object_t *p_parent,
input_item_t *p_item )函数中创建的线程,线程函数为
static int RunThread( input_thread_t *p_input )
线程思路分析:
由 input_thread_t结构的成员分析是接收文件流还是网络流,如果是文件流,则调用file module 的读函数(pf_read)和打开函数(--).如果是network 则打开network module 的打开函数和读函数(pf_read)。
在 RunThread线程函数中接收数据和调用demux 或者decode etc处理。
一旦产生新的输入,则在播放列表线程中会首先结束该输入线程,然后从新创建新的输入线程。
3. 视频输出文件src/video_output/ video_output.c的线程
vout_thread_t * __vout_Create( vlc_object_t *p_parent,
unsigned int i_width, unsigned int i_height,
vlc_fourcc_t i_chroma, unsigned int i_aspect )函数中创建的线程,线程函数为
static void RunThread( vout_thread_t *p_vout)
线程思路分析:
在RunThread里面执行循环,任务是显示视频。
4. 在modules\gui\wxwindows\wxwindows.cpp中的GUI线程
static void Run( intf_thread_t *p_intf ) 函数中创建的线程,线程函数为
static void Init( intf_thread_t *p_intf )
线程思路分析:
在Init( intf_thread_t *p_intf )里面执行循环,创建新的GUI实例。Instance-》OnInit()(CreateDialogsProvider)-》DialogsProvider为运行的对话框。
接收网络文件的步骤
OnOpenNet( wxCommandEvent& event )打开网络文件的步骤。打开OpenDialog对话框,点击Ok后调用OpenDialog::OnOk( wxCommandEvent& WXUNUSED(event) )函数,调用playlist_Command函数改变播放列表线程的状态。
激活线程分析:
在wxwindow.cpp中的消息映射中 set_callbacks( OpenDialogs, Close ); 则设置了module_t->pf_activate= OpenDialogs函数,
在module.c 的__module_Need( vlc_object_t *p_this, const char *psz_capability,
const char *psz_name, vlc_bool_t b_strict )
函数中用到了pf_activate激活GUI对话框;
在video_output.c 的static void RunThread( vout_thread_t *p_vout)线程中,也用到了pf_activate激活GUI对话框;
5. 开始所有module 的精髓
消息映射宏
vlc_module_begin();
set_callbacks( NetOpen, NULL );
vlc_module_end();
然后设置模块结构的成员函数为:
#define set_callbacks( activate, deactivate ) \
p_submodule->pf_activate = activate; \
p_submodule->pf_deactivate = deactivate
在__module_Need函数中启动pf_activate 激活相应的module。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jsphuang/archive/2005/01/27/271133.aspx
相关文章推荐
- 【MyBatis框架】MyBatis入门程序第二部分
- 【MyBatis框架】MyBatis入门程序第二部分
- 关于用Java程序实现8421码权限管理 -第二部分
- 【MyBatis框架】MyBatis入门程序第二部分
- 第二人生的源码分析(四十二)实现消息处理的线程类
- 第二人生的源码分析(四十二)实现消息处理的线程类
- 第二人生的源码分析(四十二)实现消息处理的线程类
- 【MyBatis框架】MyBatis入门程序第二部分
- [数据结构与算法]常用排序算法分析与实现:第二部分
- 如何优化cocos2d程序的内存使用和程序大小:第二部分(完)
- [原创] 用Delphi实现控制IE窗体的大小——IESizer程序原理分析 (2003-12)
- Linux网络编程---ICMP协议分析及ping程序实现
- java程序cpu占用率高,分析具体线程
- 腾讯2016-9-1 软件测试工程师 模拟考 第二部分 程序题目
- 《Spring Security3》第五章第二部分翻译下(实现授权精确控制的方法——页面级权限)
- 编译原理:递归向下分析程序建立语法分析树的Java实现(一)
- 第二人生的源码分析(3)程序入口点
- PL0语法分析程序(表达式部分)
- Java实现的网络爬虫程序,简单易懂无框架(我的网络大作业)
- 第二人生的源码分析(八十五)LLView实现OpenGL窗口显示