相对printf(),对于多线程的cout<<输出乱码的问题

本文探讨了printf()函数与cout对象的区别。printf()属于标准C库,而cout是C++标准库的一部分,为ostream类的一个实例。文章指出,在考虑线程同步问题时,使用printf()更为高效;cout虽然提供更丰富的功能,但输出速度相对较慢。

首先从他们各自本身出发,printf()是一个函数,而cout是预定义ostream一个对象。

因此就涉及到了对象线程同步问题。

则在使用打印输出时,应该考虑到这个问题。简单的话直接用printf()输出,而采用同步互斥进行cout会进一步增加编译处理时间。从而影响效率。另外cout输出确实比printf()慢呐,编个小程序输出下就会有很大感触。

分析下下面的代码:XAFS_CSDKResult GeneralTypeControllerSDK::SocketSendMessage(SOCKET socket, const int * Protocol, unsigned int memSize,int waitTime) { //开始之前先进行设置 m_ReceiveCmdSuccedFlag = false; GInterface::Instance()->g_OrderSign = 0; GInterface::Instance()->g_AddrSign = 0; unsigned char buffer[1024] = { 0 }; m_WriteAddr = Protocol[2]; for (int i = 0; i < memSize; i++) { //调用调换大小端问题 uint32_t swapped = swapEndian(Protocol[i]); memcpy(buffer + i * sizeof(int), &swapped, sizeof(int)); } if (send(socket, (char*)buffer, memSize, 0) < 0) { cout << "发送失败!" << endl; return ERR_SOCKET; } else { cout << "发送成功!" << endl; DWORD tick = ::GetTickCount(); while (true) { if (::GetTickCount() - tick > waitTime) { /*delete m_ReturnData; m_ReturnData = nullptr;*/ return ERR_TIMEOUT; } /*else if(m_ReceiveCmdSuccedFlag) { return ERR_OK; }*/ else { /*cout << "GInterface::Instance()->g_OrderSign==" << GInterface::Instance()->g_OrderSign<<endl; cout << "GInterface::Instance()->g_AddrSign==" << GInterface::Instance()->g_AddrSign << endl;*/ if (GInterface::Instance()->g_OrderSign == STATUS_INST) { return ERR_OK; } else if ((GInterface::Instance()->g_OrderSign == Protocol[1])&&(GInterface::Instance()->g_AddrSign == Protocol[2])) { return ERR_OK; } else if ((GInterface::Instance()->g_OrderSign == FDBK_INST) &&(GInterface::Instance()->g_AddrSign == Protocol[2])) { return ERR_OK; } } GInterface::Instance()->MsSleep(10); } } } XAFS_CSDKResult GeneralTypeControllerSDK::SocketSendNoWaitData(SOCKET socket, const int* Protocol, unsigned int memSize) { //开始之前先进行设置 m_ReceiveCmdSuccedFlag = false; unsigned char buffer[1024] = { 0 }; m_WriteAddr = Protocol[2]; for (int i = 0; i < memSize; i++) { //调用调换大小端问题 uint32_t swapped = swapEndian(Protocol[i]); memcpy(buffer + i * sizeof(int), &swapped, sizeof(int)); } if (send(socket, (char*)buffer, memSize, 0) < 0) { //cout << "发送失败!" << endl; return ERR_SOCKET; } else { //cout << "发送成功!" << endl; return ERR_OK; } } XAFS_CSDKResult GeneralTypeControllerSDK::SocketSendRemoteUp(SOCKET socket, const char * data, unsigned int binSize) { if (send(socket, (char*)data, binSize, 0) < 0) { cout << "发送失败!" << endl; return ERR_SOCKET; } else { //cout << "发送远程升级bin进网络端成功!" << endl; return ERR_OK; } } //线程中不断的读取网口中的数据 void GeneralTypeControllerSDK::SocketLisntenThread() { unsigned char rec_Buffer[8192] = { 0 }; cout << " enter SocketLisntenThread1111111====" << endl; while (m_ListenFlag) { int recvLength = recv(m_SocketClient, (char*)rec_Buffer, sizeof(rec_Buffer), 0); cout << "实际接收==recvLength===" << recvLength << endl; if (recvLength < 0) { cout << "接受失败!通信断开" << endl; break; } else if (recvLength == 0) { cout << "服务器已主动断开连接" << endl; } else { //组数进缓存区 m_BufferMutex.lock(); memmove(m_RawDataBuff + m_RawLength, rec_Buffer, recvLength); m_RawLength += recvLength; cout << "服务端信息:" << rec_Buffer << endl; cout << "recvLength==" << recvLength << endl; //for (int i = 0; i< recvLength;i++) //{ // printf("11111111111111recvLength==%x\n", rec_Buffer[i]); //} m_BufferMutex.unlock(); } //每隔20ms读取网口一次 Sleep(20); } } //线程中不断的尝试过滤读取到的数据 void GeneralTypeControllerSDK::SocketFilterDataThread() { unsigned char dealData[8192] = { 0 }; bool b_findHead = false; cout << " enter SocketFilterDataThread2222222===" << endl; while (m_HandDataFlag) { m_BufferMutex.lock(); //接收到的数据一定比协议数据最短包大 if (m_RawLength < MIN_BAG) { m_BufferMutex.unlock(); Sleep(20); continue; } //寻找头字节 int offset = 0; b_findHead = false; //判断容器内第一个数据 if ((m_RawDataBuff[0] == HEAD_ID1) && (m_RawDataBuff[1] == HEAD_ID2) && (m_RawDataBuff[2] == HEAD_ID3) && (m_RawDataBuff[3] == HEAD_ID4)) { b_findHead = true; } /***************找数据包头的过程***********/ if (!b_findHead) { //循环遍历找包头 while (((m_RawDataBuff[offset] != HEAD_ID1) || (m_RawDataBuff[offset + 1] != HEAD_ID2) || (m_RawDataBuff[offset + 2] != HEAD_ID3) || (m_RawDataBuff[offset + 3] != HEAD_ID4)) && (offset < (m_RawLength - 4))) { offset++; } //找包头的位置是数据容器的尾部, if (offset >= (m_RawLength - 4)) { m_BufferMutex.unlock(); m_RawLength = 0; Sleep(20); continue; } //整体搬运,清理无效数据,提取有效的部分 if (offset > 0) { m_RawLength -= offset; memmove(m_RawDataBuff, m_RawDataBuff + offset, m_RawLength); if (m_RawLength < MIN_BAG) { m_BufferMutex.unlock(); Sleep(20); continue; } } } /*********************************************************************************/ //获取完整包长度 加上头和长度部分的大小 int ActualLength = 0; /*if((g_RawDataBuff[offset] != HEAD_ID1) && (g_RawDataBuff[offset + 1] != HEAD_ID2)) {}*/ //判断帧标识[4]/[5]/[6]/[7],判断帧标识是:写返回/读返回/批量返回/ //重新定义length的长度,确定最终读与写都是20,但是批量的需要自己判断,是否需要判断 if ((m_RawDataBuff[4] == WRITE_TYPE1) && (m_RawDataBuff[5] == WRITE_TYPE2) && (m_RawDataBuff[6] == WRITE_TYPE3) && (m_RawDataBuff[7] == WRITE_TYPE4)) { ActualLength = 20; } /*else if ((m_RawDataBuff[4] == READ_TYPE1) && (m_RawDataBuff[5] == READ_TYPE2) && (m_RawDataBuff[6] == READ_TYPE3) && (m_RawDataBuff[7] == READ_TYPE4)) { ActualLength = 20; }*/ else if ((m_RawDataBuff[4] == FBACK_TYPE1) && (m_RawDataBuff[5] == FBACK_TYPE2) && (m_RawDataBuff[6] == FBACK_TYPE3) && (m_RawDataBuff[7] == FBACK_TYPE4)) { ActualLength = 20; } else if ((m_RawDataBuff[4] == DEVICE_STATEFLOW1) && (m_RawDataBuff[5] == DEVICE_STATEFLOW2) && (m_RawDataBuff[6] == DEVICE_STATEFLOW3) && (m_RawDataBuff[7] == DEVICE_STATEFLOW4)) { //状态查询数据流 unsigned char dataLength = m_RawDataBuff[15]; int totalLength = 16 + dataLength; ActualLength = totalLength; //cout << "dataLength11111===" << dataLength << endl; //printf("dataLength111= %d\n",dataLength); //cout << "ActualLength11111===" << ActualLength << endl; } else { // 补充:未知包类型,跳过当前字节(避免死锁) m_RawLength--; memmove(m_RawDataBuff, m_RawDataBuff + 1, m_RawLength); m_BufferMutex.unlock(); Sleep(20); continue; } //else if ((m_RawDataBuff[4] == SYNC_DATAFLOW1) && (m_RawDataBuff[5] == SYNC_DATAFLOW2) // && (m_RawDataBuff[6] == SYNC_DATAFLOW3) && (m_RawDataBuff[7] == SYNC_DATAFLOW4)) //{ // //状态同步数据流 // unsigned char dataLength = m_RawDataBuff[15]; // int totalLength = 16 + dataLength*8 + 8; // ActualLength = totalLength; //} //cout << "ActualLength1111==" << ActualLength; //如果获取的数据长度不满足一包的长度,则等待一会后重新解析 if (m_RawLength < ActualLength) { m_BufferMutex.unlock(); Sleep(20); continue; } //判断帧尾,有问题清理重新开始 if ((m_RawDataBuff[ActualLength - 4] != TAIL_ID1) || (m_RawDataBuff[ActualLength - 3] != TAIL_ID2) || (m_RawDataBuff[ActualLength - 2] != TAIL_ID3) || (m_RawDataBuff[ActualLength - 1] != TAIL_ID4)) { m_BufferMutex.unlock(); m_RawLength -= ActualLength; memmove(m_RawDataBuff, m_RawDataBuff + ActualLength, m_RawLength); if (m_RawLength < MIN_BAG) { m_BufferMutex.unlock(); Sleep(20); continue; } } //清空待处理数据 memset(dealData, 0, sizeof(dealData)); //复制有效包数据到待处理缓冲中 memcpy(dealData, m_RawDataBuff, ActualLength); m_RawLength -= ActualLength; cout << "ActualLength2222==" << ActualLength<<endl; //cout << "m_RawLength2222==" << m_RawLength; //单条指令帧进行收发,不需要进行和校验 int getCheckSum = (dealData[ActualLength - 8] << 24) | (dealData[ActualLength - 7] << 16) | (dealData[ActualLength - 6] << 8) | (dealData[ActualLength - 5]); uint32_t actualChecksum = 0; if (((m_RawDataBuff[4] == DEVICE_STATEFLOW1) && (m_RawDataBuff[5] == DEVICE_STATEFLOW2) && (m_RawDataBuff[6] == DEVICE_STATEFLOW3) && (m_RawDataBuff[7] == DEVICE_STATEFLOW4))) { // 确保不会越界访问,i+3 < dataLength-8 for (int i = 0; (i + 3) < (ActualLength - 8); i += 4) { // 修正了最后一个字节的索引错误 uint32_t j = (dealData[i] << 24) | (dealData[i + 1] << 16) | (dealData[i + 2] << 8) | dealData[i + 3]; actualChecksum += j; } if (getCheckSum != actualChecksum) { printf("sumError==%x\n"); continue; } } //从原始数据缓冲中移除有效包数据 memcpy(m_RawDataBuff, m_RawDataBuff + ActualLength, m_RawLength); //包长度小于最小包长度时,直接返回重新解析 if (ActualLength < MIN_BAG) { continue; } //在应用层处理合法的数据包,开始解析一包正常的数据 //将数据进行回传处理 //memcpy(m_ReturnData, dealData, ActualLength); //*returnLength = length; cout << "ActualLength===" << ActualLength << endl; for (int k = 0; k < ActualLength; k++) { //printf("dealData==%x\n", dealData[i]); } //对数据进行分类过滤 this->FilterData(dealData); //结束加锁 m_BufferMutex.unlock(); } } unsigned int GeneralTypeControllerSDK::JointHexData(unsigned char *pData) { unsigned int data = (*(pData + 0) << 24) | (*(pData + 1) << 16) | (*(pData + 2) << 8) | (*(pData + 3)); return data; } void GeneralTypeControllerSDK::FilterData(unsigned char * pData) { //int cmd = (pData[4]<<24)|(pData[5] << 16)|(pData[6] << 8)|(pData[7]); //int regAddr = (pData[8] << 24) | (pData[9] << 16) | (pData[10] << 8) | (pData[11]); //m_ReturnValue = (pData[12] << 24) | (pData[13] << 16) | (pData[14] << 8) | (pData[15]); int cmd = JointHexData(&pData[4]); int regAddr = JointHexData(&pData[8]); m_ReturnValue = JointHexData(&pData[12]); int registerNum = JointHexData(&pData[12]); int byteNum = JointHexData(&pData[12]); cout << "m_ReturnValue===" << m_ReturnValue << endl; if (cmd == WRITE_INST) { //写入返回值寄存器值 if (m_WriteAddr == regAddr) { m_ReceiveCmdSuccedFlag = true; GInterface::Instance()->g_AddrSign = regAddr; GInterface::Instance()->g_OrderSign = cmd; } } else if (cmd == FDBK_INST) { //读返回值寄存器值 if (m_WriteAddr == regAddr) { m_ReceiveCmdSuccedFlag = true; GInterface::Instance()->g_AddrSign = regAddr; GInterface::Instance()->g_OrderSign = cmd; } } else if (cmd == STATUS_INST) { GInterface::Instance()->g_OrderSign = cmd; int count = 0; int syncEnd = byteNum+16-8-4; GInterface::Instance()->g_GetSyncFlag = false; for (int i = STATUS_START; i <= syncEnd; i= i+4) { int data = JointHexData(&pData[i]); StateDataArr[count] = data; count++; } GInterface::Instance()->g_GetStateFlag = true; m_ReceiveCmdSuccedFlag = true; } }
最新发布
10-22
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值