本人有一程序,用于播放实时图像和历史回放,实时图像没问题,有问题的是历史图像(debug下正常,release不正常):主要差别为:实时播放时,系统发过来的图像信息前有6个字节的信息头,回放存储的文件是没有这6个信息头的,于是我在读回放文件时,人为加了6个字节的头:
此段程序用于从文件中读取数据,放入对应buffer中:
f = fopen(fileN, "rb" );
if (f==NULL)
{
return 0;
}
fseek(f, current_size, SEEK_SET); if (fread(s, sizeof( char ), 2, f) > 1)
{
unsigned short size = s[0]*256 +s[1];
if (size>0)
{
m_csRecv[WINDOWSNUM].Lock();
fread(vv[WINDOWSNUM].data, sizeof( char ), size, f);
memcpy(vv[WINDOWSNUM].data+6,vv[WINDOWSNUM].data,size);
vv[WINDOWSNUM].data[0] = HIBYTE(writenum);
vv[WINDOWSNUM].data[1] = LOBYTE(writenum);
vv[WINDOWSNUM].data[2] = HIBYTE(size+6);
vv[WINDOWSNUM].data[3] = LOBYTE(size+6);//11
vv[WINDOWSNUM].data[4]=0;
vv[WINDOWSNUM].data[5] = 0;/**/
vv[WINDOWSNUM].len = size+6;//
vv[WINDOWSNUM].m_picHwnd = hwnd;
writenum++;
if(recvlenall[WINDOWSNUM]+size+6<Q_SIZE)//
{
memcpy(recvbufferall[WINDOWSNUM]+recvlenall[WINDOWSNUM],vv[WINDOWSNUM].data,size+6);//
recvlenall[WINDOWSNUM]+=size+6;//11
}
else
{
int endlen = recvlenall[WINDOWSNUM]+size+6;//11
int leavelen = Q_SIZE - recvlenall[WINDOWSNUM];
memcpy(recvbufferall[WINDOWSNUM]+recvlenall[WINDOWSNUM],vv[WINDOWSNUM].data,leavelen);
recvlenall[WINDOWSNUM]+=leavelen;
recvlenall[WINDOWSNUM] = 0;
unsigned long headlen = endlen%Q_SIZE;
if((headlen < readlp[WINDOWSNUM])||(headlen == readlp[WINDOWSNUM]))
{
memcpy(recvbufferall[WINDOWSNUM],vv[WINDOWSNUM].data+leavelen,headlen);
recvlenall[WINDOWSNUM] = headlen;
}
}//else
m_csRecv[WINDOWSNUM].Unlock();
}
fclose(f);
return current_size+size+2;
}
问题在这段代码:
memcpy(vv[WINDOWSNUM].data+6,vv[WINDOWSNUM].data,size);
vv[WINDOWSNUM].data[0] = HIBYTE(writenum);
vv[WINDOWSNUM].data[1] = LOBYTE(writenum);
vv[WINDOWSNUM].data[2] = HIBYTE(size+6);
vv[WINDOWSNUM].data[3] = LOBYTE(size+6);//11
vv[WINDOWSNUM].data[4]=0;
vv[WINDOWSNUM].data[5] = 0;/**/
vv[WINDOWSNUM].len = size+6;//
vv[WINDOWSNUM].m_picHwnd = hwnd;
writenum++;
加上这6个字节,则历史回放不正常,不加需要修改记录时文件的存储格式,可以做到播放正常,但是和以往软件不兼容,我希望在能和以往软件兼容,但是这段代码应该没问题,因为debug下他是好的。可是到底问题在哪里呢,请高手指点!
此段程序用于从文件中读取数据,放入对应buffer中:
f = fopen(fileN, "rb" );
if (f==NULL)
{
return 0;
}
fseek(f, current_size, SEEK_SET); if (fread(s, sizeof( char ), 2, f) > 1)
{
unsigned short size = s[0]*256 +s[1];
if (size>0)
{
m_csRecv[WINDOWSNUM].Lock();
fread(vv[WINDOWSNUM].data, sizeof( char ), size, f);
memcpy(vv[WINDOWSNUM].data+6,vv[WINDOWSNUM].data,size);
vv[WINDOWSNUM].data[0] = HIBYTE(writenum);
vv[WINDOWSNUM].data[1] = LOBYTE(writenum);
vv[WINDOWSNUM].data[2] = HIBYTE(size+6);
vv[WINDOWSNUM].data[3] = LOBYTE(size+6);//11
vv[WINDOWSNUM].data[4]=0;
vv[WINDOWSNUM].data[5] = 0;/**/
vv[WINDOWSNUM].len = size+6;//
vv[WINDOWSNUM].m_picHwnd = hwnd;
writenum++;
if(recvlenall[WINDOWSNUM]+size+6<Q_SIZE)//
{
memcpy(recvbufferall[WINDOWSNUM]+recvlenall[WINDOWSNUM],vv[WINDOWSNUM].data,size+6);//
recvlenall[WINDOWSNUM]+=size+6;//11
}
else
{
int endlen = recvlenall[WINDOWSNUM]+size+6;//11
int leavelen = Q_SIZE - recvlenall[WINDOWSNUM];
memcpy(recvbufferall[WINDOWSNUM]+recvlenall[WINDOWSNUM],vv[WINDOWSNUM].data,leavelen);
recvlenall[WINDOWSNUM]+=leavelen;
recvlenall[WINDOWSNUM] = 0;
unsigned long headlen = endlen%Q_SIZE;
if((headlen < readlp[WINDOWSNUM])||(headlen == readlp[WINDOWSNUM]))
{
memcpy(recvbufferall[WINDOWSNUM],vv[WINDOWSNUM].data+leavelen,headlen);
recvlenall[WINDOWSNUM] = headlen;
}
}//else
m_csRecv[WINDOWSNUM].Unlock();
}
fclose(f);
return current_size+size+2;
}
问题在这段代码:
memcpy(vv[WINDOWSNUM].data+6,vv[WINDOWSNUM].data,size);
vv[WINDOWSNUM].data[0] = HIBYTE(writenum);
vv[WINDOWSNUM].data[1] = LOBYTE(writenum);
vv[WINDOWSNUM].data[2] = HIBYTE(size+6);
vv[WINDOWSNUM].data[3] = LOBYTE(size+6);//11
vv[WINDOWSNUM].data[4]=0;
vv[WINDOWSNUM].data[5] = 0;/**/
vv[WINDOWSNUM].len = size+6;//
vv[WINDOWSNUM].m_picHwnd = hwnd;
writenum++;
加上这6个字节,则历史回放不正常,不加需要修改记录时文件的存储格式,可以做到播放正常,但是和以往软件不兼容,我希望在能和以往软件兼容,但是这段代码应该没问题,因为debug下他是好的。可是到底问题在哪里呢,请高手指点!
解决方案 »
- 关于区分真正硬件消息和模拟消息
- 如何获得一个指定服务的状态参数
- 如何在自己的vc程序中启动ie,急,请高手指点,多谢了
- 如何把自己写的程序添加到“打开放式”列表里?
- 两开机自动运行程序,A运行后怎样发信号告诉B以便socket通讯?
- pch预编译头文件和编译器开关
- 高分放送,我有一个服务器程序,怎样禁止非法客户的连接,如果有非法客户程序来CONNECT 我,我该怎么办?怎样使别人无法CONNECT 我?
- 问一个简单的问题(关于CRecordset类的)
- 如何调用系统文件夹属性对话来显示 多个 文件的属性对话框?
- 我在注册动态库时出现下面的提示,请大虾批引迷精.
- 数字键与字母键的虚键码是什么。
- 如何生成LIB,和.h文件供其他人使用
出现问题的一种可能性是在不同版本的编译间定义了不同的预处理标记。请对你的DEBUG版本的软件试一下以下改动: 在"Project Setting(ALT-F7)" 中的C/C++项中设置目录(category)为"General",并且改动"_DEBUG"定义为"NDEBUG".
设置目录为"Preprocessor"并且添加定义"_DEBUG到"Undefined Symbols"输入框.
选择Rebuild ALL,重新编译.
如果经过编译的程序产生了问题,请对代码进行如下改动:
将ASSERT() 改为 VERIFY()。因为ASSERT中的内容在Release版本中不被编译。
找出定义在"#ifdef _DEBUG"中的代码,如果在RELEASE版本中需要这些代码请将他们移到定义外。
查找TRACE(...)中代码,因为这些代码在RELEASE中也不被编译。
所以请认真检查那些在RELEASE中需要的代码是否并没有被编译。 4、变量的初始化所带来的不同,在不同的系统,或是在DEBUG/RELEASE版本间都存在这样的差异,所以请对变量进行初始化。 5、是否在编译时已经有了警告?请将警告级别设置为3或4,然后保证在编译时没有警告出现. 6、是否改动了资源文件. 7、此外对RELEASE版本的软件也可以进行调试,请做如下改动: 在"Project Settings" 中 "C++/C " 项目下设置 "category" 为 "General" 并且将"Debug Info"设置为 "Program Database".
在"Link"项目下选中"Generate Debug Info"检查框。
"Rebuild All"
如此做法会产生的一些限制:
无法获得在MFC DLL中的变量的值。
必须对该软件所使用的所有DLL工程都进行改动。
另:
MS BUG:MS的一份技术文档中表明,在VC5中对于DLL的"Maximize Speed"优化选项并未被完全支持,因此这将会引起内存错误并导致程序崩溃。