程序退出没有响应

alexander_david 2010-11-23 02:48:13
一个基于dshow框架的程序,在退出的时候,偶尔会没有响应,从任务管理器上看到,此时进程的cpu占用率是0。

原先在程序中使用了临界区,估计是临界区问题,但现在把临界区操作和临界区变量都去除后,仍然出现同样问题。

请问这个是哪个方面出了问题?
...全文
246 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
alexander_david 2010-11-24
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 eyey1 的回复:]
我只是猜测啦,以前碰到过类试的bug,render没有停止,但source filter停止了数据流,造成有些filter一直在等数据,卡死了.所以应该保证render停止取数据先.
希望没有打乱你自己的思路.好运!
[/Quote]

谢谢。
我再检查一下相关的Filter。
手机写程序 2010-11-24
  • 打赏
  • 举报
回复
我只是猜测啦,以前碰到过类试的bug,render没有停止,但source filter停止了数据流,造成有些filter一直在等数据,卡死了.所以应该保证render停止取数据先.
希望没有打乱你自己的思路.好运!
alexander_david 2010-11-24
  • 打赏
  • 举报
回复
to eyey1:我昨天晚上,在OnBnClickedCancel()内,kill掉定时器,但后来还是出现程序没有响应的问题。

你说的render和filter死锁,是怎么回事,我不明白,能不能解释一下?

alexander_david 2010-11-24
  • 打赏
  • 举报
回复
谢谢各位的回复。
我再查询一些资料,等有些结果再说吧。谢谢。
瓶盒 2010-11-24
  • 打赏
  • 举报
回复
可以把baseclass库加入项目,在mFilterGraph->Stop();设断点,一步步跟进去看下。
Sou2012 2010-11-24
  • 打赏
  • 举报
回复
一步一步DEBUG吧。。
手机写程序 2010-11-24
  • 打赏
  • 举报
回复
CDXGraph没见过,以前都是自己管理graph.

这个又该如何进一步查找错误的原因呢?
我觉得你这个bug每次都出现,以你的功底,跟下去肯定没问题,只是时间的问题.只能给楼上相同的建议,继续调试下去吧.另外不妨先把音频部分去掉,专心调视频.如果怀疑是CDXGraph或render(是自己做的吗)有问题,可以先在graphedit里看看有没有这样的问题.这样可以排除视频渲染Filter的问题.

还有请问,你停止Filter的时候,是自己一个一个Filter停止的吗?还是用类似上面的Filter Graph的Stop()方法?
现在不做视频这行了,不太记得了,好象应该是render有suspend或stop的接口,停止取数据,然后再向上逐个停止filter.

PS.向lz混到不少分,这次的目的主要还是混分的.谢谢lz.希望我的建议还是不要误导lz.


alexander_david 2010-11-24
  • 打赏
  • 举报
回复
to bottlebox:
自己写的就两个Filter: dump和gargle

dump里面的确有:
STDMETHODIMP CDumpFilter::Stop()
{
CAutoLock cObjectLock(m_pLock);
//if (m_pDump)
// m_pDump->CloseFile();
return CBaseFilter::Stop();
}
因为我不需要dump的文件功能,所以把所有和文件有关的操作都屏蔽。

另外的gargle根本就没有stop,那么Graph就应该调用它的基类的stop吧?
所以感觉查这个问题,有点无从下手,还请再指点一下。



瓶盒 2010-11-24
  • 打赏
  • 举报
回复
这个看来要跟进Filter的代码中才找得到问题所在,估计可能是自定义Filter响应Stop消息时出了问题。
链路如果是建立在Graph中的,当然是调用Graph的Stop()方法。如果是自已建立的链路,则要自己调用每个Filter的Stop
alexander_david 2010-11-24
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 eyey1 的回复:]
我只是猜测啦,以前碰到过类试的bug,render没有停止,但source filter停止了数据流,造成有些filter一直在等数据,卡死了.所以应该保证render停止取数据先.
希望没有打乱你自己的思路.好运!
[/Quote]

刚才测试了好多次,终于发现在停止Filter Graph的时候出错,这个函数没有返回,造成程序没有响应:
CDXGraph * mFilterGraph;

mFilterGraph->Stop();
CDXGraph类来自陆其明的源码。不知道为什么停不了,我的源filter是一个大公司的数据捕获卡,接一路视频渲染Filter,另外接一个自己改写自Dump(dshow范例)的Filter,另外这个卡有音频输出,接改写自gargle(dshow范例)的Filter,在gargle后再接音频渲染Filter。

这个又该如何进一步查找错误的原因呢?

还有请问,你停止Filter的时候,是自己一个一个Filter停止的吗?还是用类似上面的Filter Graph的Stop()方法?



alexander_david 2010-11-23
  • 打赏
  • 举报
回复
to eyey1: 我现在先关闭定时器,然后再测试看看。谢谢回复。
手机写程序 2010-11-23
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 alexander_david 的回复:]
引用 7 楼 hgy413 的回复:
引用 5 楼 alexander_david 的回复:
引用 4 楼 jyh_baoding 的回复:
可以调试一下吗,错误在相同的条件下有重复性的


是这样的,我的主程序是一个对话框程序,启动调用了两个自定义的Filter,刚才看了一下,这两个Filter都是release版本的,但是我刚才执行的主程序都是debug版本的,并且我是用F5启动的……
[/Quote]
定时器没有关闭而窗口已经销毁,可能使ontimer里出问题,如果有问题多数是会崩掉了.
你是不是忘记先停止render了,使render和你的filter取数据时死锁了.
alexander_david 2010-11-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 hgy413 的回复:]
引用 5 楼 alexander_david 的回复:
引用 4 楼 jyh_baoding 的回复:
可以调试一下吗,错误在相同的条件下有重复性的


是这样的,我的主程序是一个对话框程序,启动调用了两个自定义的Filter,刚才看了一下,这两个Filter都是release版本的,但是我刚才执行的主程序都是debug版本的,并且我是用F5启动的,所以我怀疑是否是因为是版本的问题。我现……
[/Quote]

的确不是这个版本的原因。现在用trace跟踪,希望能发现问题所在。
另外问一下,如果定时器没有关闭,不会引起这个问题吧?谢谢回复。
花熊 2010-11-23
  • 打赏
  • 举报
回复
按ESC键后,你确定主Dialog响应了oncancel这个函数??
花熊 2010-11-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 alexander_david 的回复:]
引用 4 楼 jyh_baoding 的回复:
可以调试一下吗,错误在相同的条件下有重复性的


是这样的,我的主程序是一个对话框程序,启动调用了两个自定义的Filter,刚才看了一下,这两个Filter都是release版本的,但是我刚才执行的主程序都是debug版本的,并且我是用F5启动的,所以我怀疑是否是因为是版本的问题。我现在将主程序也修改为release版本,用Ctrl+F5……
[/Quote]这个和debug版本应该毫无关系吧!
手机写程序 2010-11-23
  • 打赏
  • 举报
回复
死锁了吧,用dbgview抓些打印信息看看.
alexander_david 2010-11-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jyh_baoding 的回复:]
可以调试一下吗,错误在相同的条件下有重复性的
[/Quote]

是这样的,我的主程序是一个对话框程序,启动调用了两个自定义的Filter,刚才看了一下,这两个Filter都是release版本的,但是我刚才执行的主程序都是debug版本的,并且我是用F5启动的,所以我怀疑是否是因为是版本的问题。我现在将主程序也修改为release版本,用Ctrl+F5启动,现在正在测试。

谢谢回复。
jyh_baoding 2010-11-23
  • 打赏
  • 举报
回复
可以调试一下吗,错误在相同的条件下有重复性的
alexander_david 2010-11-23
  • 打赏
  • 举报
回复
主程序是一个对话框程序,程序启动后,设置新分辨率,对话框最大化,然后开始处理数据。

退出后,对话框关闭,恢复原先的分辨率。

现在的问题是,按ESC键后,从画面看,数据停止处理,但对话框仍然是最大化状态,不能关闭,也没有恢复原先的分辨率。

谢谢两位回复。
fandh 2010-11-23
  • 打赏
  • 举报
回复
也有可能是里面的内存已经不对了!
加载更多回复(1)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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