请各位大侠指点,这是线程中一段代码,请问什么地方还可以继续优化,提高代码执行速度
int EM9170_CAN::PackagePro( char* Buf, int len )
{
// 对接收的数据进行处理,这里为简单的数据回发
int i1;
PCAN_PACKET pmsg;
CString str;
double df_time;
CString str_data;
int i; pmsg = (PCAN_PACKET)Buf;
DWORD Ms_timer;
Ms_timer = GetTickCount();
if(0 == First_Recv_Flag)
{
df_time = 0.0010;
First_Time = Ms_timer;
First_Recv_Flag = 1;
m_count_Recv = 0;
My_Max_Count = 0;
m_Str = _T("");
str = _T(" 0.000000 Start of measurement\r");
m_FRecordFile.Seek(0,CFile::end);
m_FRecordFile.WriteString( str ); }
else
{
df_time = (double)((Ms_timer - First_Time) / 1000.000);
}
if(pmsg->dwID > 0x7ff)
{
str.Format(_T("%11.6f 1 %Xx RX d %d "),df_time,pmsg->dwID,pmsg->dwDatLen);
}
else
{
str.Format(_T("%11.6f 1 %-16XRX d %d "),df_time,pmsg->dwID,pmsg->dwDatLen);
} for(i = 0; i < pmsg->dwDatLen; i++)
{
str_data.Format(_T("%-2x "),pmsg->ucDat[i]);
str += str_data;
}
m_count_Recv ++;
if(m_count_Recv >= FRAME_BUF_LEN)
{
str += _T("\r");
m_Str += str;
m_FRecordFile.Seek(0,CFile::end);
m_FRecordFile.WriteString( m_Str);
m_Str = _T("");
m_count_Recv = 0;
My_Max_Count++;
if(My_Max_Count > MAX_COUNT)
{
str = _T("End TriggerBlock\r");
m_FRecordFile.Seek(0,CFile::end);
m_FRecordFile.WriteString( str );
m_FRecordFile.Close();
m_count_Recv = 0; if(m_File_Num < MAX_FILE)
{
m_File_Num ++;
First_Recv_Flag = 0;
My_Max_Count = 0; CString File_Name = _T("");
CString PointFile;
File_Name.Format(_T("%d"), m_File_Num);
if(1 == m_Can_Num)
{
PointFile = _T("\\USBDisk\\CAN1RecordData") + File_Name + _T(".txt");
}
else
{
PointFile = _T("\\USBDisk\\CAN2RecordData") + File_Name + _T(".txt");
}
m_FRecordFile.Open(PointFile,CFile::modeCreate| CFile::modeWrite); CString str_head = _T("date Sun Oct 16 06:09:42 pm 2011\r\nbase hex timestamps absolute \r\ninternal events logged \r\nBegin Triggerblock Sun Oct 16 06:09:42 pm 2011\r");
m_FRecordFile.Seek(0,CFile::end);
m_FRecordFile.WriteString( str_head );
}
else
{
AfxMessageBox(_T("文件记录超出范围请保存后重新开始程序"));
CloseCAN( ); /*关闭can接收*/
m_Error_Flag = 1;
}
}
}
else
{
str += _T("\r\n");
m_Str += str;
}
return i1;
}
int EM9170_CAN::PackagePro( char* Buf, int len )
{
// 对接收的数据进行处理,这里为简单的数据回发
int i1;
PCAN_PACKET pmsg;
CString str;
double df_time;
CString str_data;
int i; pmsg = (PCAN_PACKET)Buf;
DWORD Ms_timer;
Ms_timer = GetTickCount();
if(0 == First_Recv_Flag)
{
df_time = 0.0010;
First_Time = Ms_timer;
First_Recv_Flag = 1;
m_count_Recv = 0;
My_Max_Count = 0;
m_Str = _T("");
str = _T(" 0.000000 Start of measurement\r");
m_FRecordFile.Seek(0,CFile::end);
m_FRecordFile.WriteString( str ); }
else
{
df_time = (double)((Ms_timer - First_Time) / 1000.000);
}
if(pmsg->dwID > 0x7ff)
{
str.Format(_T("%11.6f 1 %Xx RX d %d "),df_time,pmsg->dwID,pmsg->dwDatLen);
}
else
{
str.Format(_T("%11.6f 1 %-16XRX d %d "),df_time,pmsg->dwID,pmsg->dwDatLen);
} for(i = 0; i < pmsg->dwDatLen; i++)
{
str_data.Format(_T("%-2x "),pmsg->ucDat[i]);
str += str_data;
}
m_count_Recv ++;
if(m_count_Recv >= FRAME_BUF_LEN)
{
str += _T("\r");
m_Str += str;
m_FRecordFile.Seek(0,CFile::end);
m_FRecordFile.WriteString( m_Str);
m_Str = _T("");
m_count_Recv = 0;
My_Max_Count++;
if(My_Max_Count > MAX_COUNT)
{
str = _T("End TriggerBlock\r");
m_FRecordFile.Seek(0,CFile::end);
m_FRecordFile.WriteString( str );
m_FRecordFile.Close();
m_count_Recv = 0; if(m_File_Num < MAX_FILE)
{
m_File_Num ++;
First_Recv_Flag = 0;
My_Max_Count = 0; CString File_Name = _T("");
CString PointFile;
File_Name.Format(_T("%d"), m_File_Num);
if(1 == m_Can_Num)
{
PointFile = _T("\\USBDisk\\CAN1RecordData") + File_Name + _T(".txt");
}
else
{
PointFile = _T("\\USBDisk\\CAN2RecordData") + File_Name + _T(".txt");
}
m_FRecordFile.Open(PointFile,CFile::modeCreate| CFile::modeWrite); CString str_head = _T("date Sun Oct 16 06:09:42 pm 2011\r\nbase hex timestamps absolute \r\ninternal events logged \r\nBegin Triggerblock Sun Oct 16 06:09:42 pm 2011\r");
m_FRecordFile.Seek(0,CFile::end);
m_FRecordFile.WriteString( str_head );
}
else
{
AfxMessageBox(_T("文件记录超出范围请保存后重新开始程序"));
CloseCAN( ); /*关闭can接收*/
m_Error_Flag = 1;
}
}
}
else
{
str += _T("\r\n");
m_Str += str;
}
return i1;
}
解决方案 »
- 设置多次SetEvent, 只成功激活了线程一次???
- 高分请教SNMP中TRAP的问题.........
- 菜鸟问题!
- dcom配置难题...
- 阻塞與非阻塞模式分別用在什么時候,為什么要用阻塞與非阻塞模式,有什么好處?
- 一个有关VB的问题,软件马上就要提交了,就差这么个问题,拜托各位高手指点迷津!谢了!:)
- 如何得出子窗口在父窗口中的坐标位置
- 如何将字符串转换成2进制代码????(急!!)
- 请过来看看,这样是否会有问题?
- 拷贝构造函数应该执行几次?
- GetWindowText和SetWindowTextW以及SetWindowText
- [急切求助]从网上下载的屏幕录象程序不能同时录制画面和声音???
{
str_data.Format(_T("%-2x "),pmsg->ucDat[i]);
str += str_data;
} 我感觉这一块可以优化一点,因为format函数要考虑很多的事情,俺自己写一个专用的,也许会快。
for( i = 0; i < 0x100; i++ )
{
_stprintf( g____hex2str + i * 3, _T( "%.2X " ), i );
}
//**************************************
// HEX转16进制数
// 有空格
//**************************************
TCHAR *
hex2str( unsigned char *hexdata, size_t length, TCHAR *strbuffer )
{
size_t i;
TCHAR *p; if( strbuffer )
{
*strbuffer = 0;
}
else
{
//如果传入一个空串,返回一个错误信息
return g____NULL_STRING;
} //查表法
TCHAR *q;
//int j; p = strbuffer;
for( i = 0; i < length; i++ )
{
q = g____hex2str;
q += *hexdata;
q += *hexdata;
q += *hexdata;
//j = ( unsigned char )( *hexdata );
//j <<= 1;
//j += ( unsigned char )( *hexdata );
memcpy( p, q, 3 * sizeof( TCHAR ) );
p += 3;
hexdata++;
}
*p = 0;
}
}
俺就自己写过一个方法,快不快俺也不知道。
动态分配的字符串CString, 可以用CHAR []
文件写入, 可以累积到一定程度再写入
如果还要优化, 可以用整数模拟浮点运算
字符串的所有操作用C标准库来完成吧.