下面的代码不稳定,使用CVideoReplayer 提供的职责时有时会出错。
unsigned long WINAPI CSysncReplayer::DoReplayVideo( void * para )
{
try
{
CSysncReplayer * replayer = (CSysncReplayer*)para;
CVideoReplayer * videoReplayer = replayer->m_videoReplayer;
//begine read video info
while ( 1 )
{
……
}
……
}
……
}
代码分析:这是一个线程函数,当线程被中断后又继续执行的时候,就会出错。仔细分析线程被中断后又继续执行的代码,发现每次CSysncReplayer的成员变量m_videoReplayer都会被重新生成。
再看上面的代码的这一行:
CVideoReplayer * videoReplayer = replayer->m_videoReplayer;
重新定义一个指针指向replayer->m_videoReplayer;请注意:这行代码在线程中断后继续时不会被执行到。
举个相同的简单例子来说:
int n = 1;
int *p1 = &n;
int *p2 = p1;
我们看一下内存
P1,p2指向同一个地方,就是变量n的地址;但是当p1指向新的变量,p2由于某种原因(看上面红色加粗体的提示)不更新,p2便与p1指向不同的地方,并且p2指向的是一个“不再使用的地址”。那么再使用p2的话肯定就会出错。
找到出错原因后,就好解决了。为了保证在int *p2 = p1;这行代码不被执行的情况下p2能与p1保持一致,需要想想办法。
此时指针的引用和指针的指针就派上用场了。
int *&p2 = p1; 或者 int **p2 = &p1; 于是,
CVideoReplayer * videoReplayer = replayer->m_videoReplayer; 修改为
CVideoReplayer *& videoReplayer = replayer->m_videoReplayer;
问题解决。

2950

被折叠的 条评论
为什么被折叠?



