15,979
社区成员
发帖
与我相关
我的任务
分享
UINT ThreadFunc(LPVOID lparam); //工作者线程全局函数声明
BOOL m_ENDTread; // 用于线程终止标志
//以上在COMDLG.h文件中CCOMDlg类外
//类内定义以下线程指针
protected:
HICON m_hIcon;
CWinThread* pThread; //添加工作者线程的指针
//在CCOMDLG.cpp文件中的“开始测量”按钮消息响应函数添加如下:
void CCOMDlg::OnBtnSend()
{
// TODO: Add your control notification handler code here
CCOMDlg *dlg = (CCOMDlg*)GetDlgItem(IDD_COM_DIALOG);
pThread=AfxBeginThread((AFX_THREADPROC)ThreadFunc,(LPVOID)dlg,THREAD_PRIORITY_NORMAL,0,0,NULL);
}
//在线程处理函数中添加如下,其中DataCollect等几个函数是CCOMDLG的成员函数,用于采集数据,存储显示数据的:
UINT ThreadFunc(LPVOID lparam)
{
m_ENDTread=FALSE;
CCOMDlg *dlg=(CCOMDlg*)lparam;
while (!m_ENDTread)
{
dlg->DataCollect();
//延时一段时间保证激光扫描仪采集的数据完整接收
Sleep(3000); //延迟3秒
dlg->DataStore();
dlg->DataFitResult();
} //while循环结束括号
return 0;
}
//在“退出”按钮消息响应函数添加如下:
oid CCOMDlg::OnBtnExit()
{
// TODO: Add your control notification handler code here
m_ENDTread = TRUE; //结束线程
CDialog::OnCancel();
}
void CCOMDlg::DataStore()
{
//下面是将接收区域接收到的字符存进Data_jg.txt并显示在编辑框中
if(m_strRXData.GetAt(0)=='0'&&m_strRXData.GetAt(0)=='6')
{
FILE *pFile=fopen("Data_jg.txt","w");
fwrite(m_strRXData,1,strlen(m_strRXData),pFile);
fseek(pFile,0,SEEK_SET);
fclose(pFile);
}
m_strRXData.Empty(); //清空m_strRXData
/*******************这儿是打开激光仪的txt文本文档操作,把相应的字符串读到一个字符数组中************/
CFile file("Data_jg.txt",CFile::modeRead);
char *strRecv;
DWORD dwFileLen;
dwFileLen=file.GetLength();
strRecv=new char[dwFileLen+1];
strRecv[dwFileLen]=0;
file.Read(strRecv,dwFileLen);
file.Close();
/***********下一步是把txt文档的有效数据读出来**************/
char buffer[8];
int tempbuf;
int distance[410]; //比0.5度对应的362个数和0.25度对应的402个数都大。
int j=0,space_flag=0,num=0;
int jg_len=dwFileLen;
for(int i=0;i<jg_len;i++)
{
if(space_flag<8)
{
if(strRecv[i]!=0x20) //0x20是空格键
continue;
else
{space_flag++;continue;}
}
else
{
if(j<6)
buffer[j++]=strRecv[i];
else
{
tempbuf=16*HexToInt(buffer[0])+HexToInt(buffer[1])+
4096*HexToInt(buffer[3])+256*HexToInt(buffer[4]);
distance[num++]=tempbuf;
memset(buffer, 0, strlen(buffer));
j=0;
i--; //这句话很重要,否则出错
}
}
}
distance[num-2]=0;
distance[num-1]=0;
int NumAll=num-1; //NumAll存的是激光扫描的点的个数,361或者是401
/**********以通俗易懂的方式显示出激光扫描仪的数据**********/
if (NumAll==401)
{
double angle=40.00;
CString str_ang,dist;
//char extra[2]={0x0d,0x0a};
for(i=0;i<NumAll;i++)
{
str_ang.Format("%.2f",angle);
m_strDispl_jg+=str_ang;
m_strDispl_jg+="度\t";
dist.Format("%d",distance[i]);
m_strDispl_jg+=dist;
m_strDispl_jg+="mm\r\n";
angle+=0.25;
}
}
else
{
double angle0=0.0;
CString str_ang0,dist0;
for(i=0;i<NumAll;i++)
{
str_ang0.Format("%.1f",angle);
m_strDispl_jg+=str_ang0;
m_strDispl_jg+="度\t";
dist0.Format("%d",distance[i]);
m_strDispl_jg+=dist0;
m_strDispl_jg+="mm\r\n";
angle0+=0.5;
}
}
UpdateData(FALSE); //更新编辑框内容
}
void CCOMDlg::DataFitResult()
{
//显示定位结果可视图
f_GetResult=true;
CEightDlg m_eightDlg;
m_eightDlg.DoModal();
Invalidate();
}