多线程失效原因求助(关于字幕播放的实例)

limlzm 2006-06-22 10:38:30
关于字幕播放的实例。
一个播放视频的线程中,需要播放一个字幕。
int PlayThread::thread_main()
{ ...
while (wait_for_run())
{...
StartCurSubTitle();
...
}
...

int PlayThread::StartCurSubTitle()
{...
int state = subTitleThread.get_thread_state();

if (state > 0) //running
{
//stop current subtitle.
subTitleThread.pause_thread();
subTitleThread.ShowNextSub();
}
else if (state < 0) //stopped
{
//create thread , and suppused.
subTitleThread.create_thread(false);//基本上都每次循环都被调用
}
ret = subTitleThread.SetSubTitle(SubTitleThread::SUB_TITLE_FILE, node.subTitleLocalPath);

subTitleThread.resume_thread();//关键这步

return ret;
}
这个是播放线程创建字幕线程,先挂起,然后设置字幕内容,最后再用resume_thread唤醒。问题就出在唤醒上,当循环到198次左右的时候,字幕线程就不能被唤醒了。为什么会这样呢?难道线程没有被真正的释放?
下面是字幕线程的主函数
int SubTitleThread::thread_main()
{...
while (wait_for_run())
{
ret = sub.GetNextString(text);
if (ret == NO_ERROR)
{
if (!text.empty())
ShowSubTitle(text);
}
else
break;
}
...
return 0;
}
字幕线程主要是获得字幕内容,有就播放,没就退出。
大概主体结构就是这样,我想知道的是为什么前198次是正常的,后面就不能播放字幕了?希望大家有什么好的建议。
...全文
237 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Cody2k3 2006-06-22
  • 打赏
  • 举报
回复
你这个subTitlethread怎么会每次都被创建呢? 按理只需要创建一次就可以了. 我觉得你要检查的不是它有没有stop,而是它是不是第一次被创建.
fallinleave 2006-06-22
  • 打赏
  • 举报
回复
subTitleThread.pause_thread();是否只是suspend(),而没有真正终止。
据我所知,操作系统对每个进程所拥有的线程数有限制,linux是253,不过你停止到198,挺奇怪的。

你首先确保你的线程都已经终止。临界区只是保证同步的,跟你的问题应该关系不大。
limlzm 2006-06-22
  • 打赏
  • 举报
回复
tofallinleave(飞翔):恩,字幕线程每次都到198次后就不能被唤醒了,非常有规律。如果把StartCurSubTitle();注释了,不要字幕播放的话。程序可以连续播放一周内存也不会吃多少。而且运行正常。所以我也很郁闷。
to RobertBaker(黄金一代) :怎么用临界区法?
LiuYinChina 2006-06-22
  • 打赏
  • 举报
回复
没有用临界区吗?
fallinleave 2006-06-22
  • 打赏
  • 举报
回复
每次都是198次?
如果不是的话,我觉得是线程优先级的问题。是的话,程序中有潜在的bug
Cody2k3 2006-06-22
  • 打赏
  • 举报
回复
to limlzm(), 你能不能写个抽象版的可以编译运行的完整实现, 中间具体的解码显示部分都用一些dummy函数来模拟, 贴出来让大家分析分析, 这样干说比较困难.
limlzm 2006-06-22
  • 打赏
  • 举报
回复
to Cody2k3():因为播放完字幕后,字幕线程就自动释放,所以播放线程当要播放字幕的时候,他会用get_thread_state();看线程是否还在,不在的话就创建。

另:
我跟踪过创建线程的返回值。
前198次pthread_create都为0,所以能成功唤醒。但后面的值都变为12。所以就算唤醒能成功也没效果。问题就在pthread_create上面了,12代码什么呢?正在找错误代码的解释。
有谁知道呢?
Cody2k3 2006-06-22
  • 打赏
  • 举报
回复
我知道, 我的意思是只是pause的话, 并不需要重新create, thread又没有exit, 干嘛要重建?
fallinleave 2006-06-22
  • 打赏
  • 举报
回复
Cody2k3(),你再看看:
if (state > 0) //running
{
//stop current subtitle.
subTitleThread.pause_thread();
每次这句都会执行的,所以是每次都会被创建。

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧