说明:
线程a 接收数据,线程b向外发送数据,两个线程共同使用一个CList< CString, CString& >。
a往clist add 的时候使用 CRITICAL_SECTION 进行保护,b从clist get 的时候也使用 CRITICAL_SECTION 进行保护。现象:
在a接收的数据的频率低的时候没有问题,在屏蔽clist的使用的代码的情况下也不会出现问题。
在频率高的时候。就会少接收部分数据。//出问题的情况表现:
计数显示可以看出问题的现象,在频率高的情况下,计数显示会偶尔停止一次或几次,数据就是在这时丢失的。问题:个人觉得应该是 CRITICAL_SECTION 的数据保护产生的问题。
1 是CRITICAL_SECTION 的效率不够?有没有效率更高一些的?
2 还是windows的工作情况就是这样的?
3 有没有解决这种问题的其它方法呢?
解决方案 »
- 如何自定义消息
- 求救:本人照书编写了一个公式解析的类,支持if语句的,现在需要编译成dll,请高手帮忙编译,急用!
- 急!! 100分求如何在c语言中使用 ttf类型字库
- 谁能讲一下 Project->Settings 即ALT+F7 中的设置的知识?重谢!
- vc2010打开vc2003的工程
- MFC制作浏览器,怎么添加历史记录这个功能?求大婶
- 请教关于使用函数CreateProcessAsUser的问题
- 谁知道有比较好用的文本转换的接口或者开源代码,就是可以把word、pdf这样的文挡批量转化成txt的
- 如何删除托盘
- c#已经有了,那现在开始学mfc和atl有必要吗?
- c++中怎样用一个dtd文件去核对xml是否符合格式?
- VC 打印发票时向打印机发命令,退纸 进纸 可停止进纸
这样当和频率高低没有关系吧
个人建议还是贴代码,感觉上可能是你的同步错了
char csParseData[ DATA_BUFFER_LEN+1 ];
CString strTermIP;
UINT nTermPort;
BOOL nRecvLen = ReceiveFrom( csRecvData, DATA_BUFFER_LEN, strTermIP, nTermPort, 0 );
if( nRecvLen == SOCKET_ERROR )
{
//处理
return;
}
csParseData[nRecvLen] = '\0';
char* pParseData = csParseData;
int nParseLen = DATA_BUFFER_LEN;
EnterCriticalSection( &g_csWaitSendToPortalMutex );
g_listWaitSendToPortal.AddTail( CString( pParseData ) );
LeaveCriticalSection( &g_csWaitSendToPortalMutex ); AddDataRecord( pParseData ); //添加数据到显示窗口
这句不保护吗?
这句我觉得不需要保护!因为当时已经不操作CList,只有CList是公共缓冲区,另一个线程如果不会访问csParseData就没问题;
不过我没看明白,为什么有两个数组,接收用的csRecvData,但是放进CList的却是csParseData,楼主自己把握吧,我看可能是少些代码,对吧!随便提一下
AddDataRecord( pParseData ); //添加数据到显示窗口
最好改为
AddDataRecord( (const char*)csParseData); //添加数据到显示窗口
这样显示单元就无法改变接收缓冲区的内容了,我觉得用CRITICALSECTION应该没有什么效率问题
最好改为
AddDataRecord( (const char*)csParseData); //添加数据到显示窗口 这两个东西除了在编译的时候可能有不同的输出信息外,在运行的时候还有不同的地方?
"这样显示单元就无法改变接收缓冲区的内容了"这个功能貌似是由函数的定义者而不是是用者实现的吧。