关闭解码线程和gdk_threads_enter冲突问题

来源:互联网 发布:dnf深渊辅助软件 编辑:程序博客网 时间:2024/04/28 11:45

 在做海康的mp4player二次开发时,我是自己解码的,碰到了一个问题,当用户点击播放停止,我去调用Hik_PlayM4_stop时会一直没响应地停在那里。但如果我把它设成系统解码的,那一切正常。再看了sdk文档,也没有明确说这个函数在用户解码时不可用之类的信息。

 后来花了大半天时间,终生找到了问题的所在,原来在海康的解码线程,即Dec_CallBack回调函数里,在拷贝图像数据到SDL_Surface时,需要用到gdk_threads_enter()和gdk_threads_leave(),以取得gtk相关资源。但当我在外层调用Hik_PlayM4_stop(), 即SDK准备关闭这个通道的解码线程时,线程还在取得图像数据后,准备通过gdk_threads_enter()进入拷贝数据,而这时线程又被认为已经结束,不再可以获得gtk资源,于是一直等在那里,Hik_PlayM4_stop也就一直在等待线程的结束。

 解决的方法是,当用户请求停止播放时,Dec_CallBack里先收到这个信息,再发消息,或者启动定时器去调用停止播放函数,然后从回调返回。其实也直接可以在回调里停止这个通道,但不知这样程序的可读性好不好。