VC6.0两个按钮间消息会冲突吗?这样能行吗?这次粘上代码,希望高手能帮帮忙。

yrx1006_c2 2012-04-03 09:25:37
RT:大家好:
我现在想在一个“开始测量”的按钮里实现一个无限循环,就是一个死循环,但是我界面上还有一个“退出”按钮,假设我想先点击“开始测量”按钮,便一直在这个循环里不会出来,但是一点击“退出”按钮能使对话框关闭,进程结束,这样可行吗?
下边附上我创建的工作者线程的代码,但是还是会出现问题,请高手援助,在此谢过了。

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();

}



在这样编译通过后,运行程序,点击“开始测量”按钮不一会儿出现内存错误的提示,请问这药怎么解决?多谢大家相助了。
...全文
93 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
hdg3707 2012-04-04
  • 打赏
  • 举报
回复
int m_ENDTread,这个变量在CPP文件里定义,不要在头文件里定义,其它地方想引用就用:extern int m_ENDTread;
yrx1006_c2 2012-04-04
  • 打赏
  • 举报
回复
按照8楼,9楼的帮助修改程序后,之前编译都没问题的程序,现在好像在链接时候出问题了,
错误如下:
Linking...
FitLogDlg.obj : error LNK2005: "int m_ENDTread" (?m_ENDTread@@3HA) already defined in COMDlg.obj
Release/COM.exe : fatal error LNK1169: one or more multiply defined symbols found
Error executing link.exe.
shn521 2012-04-04
  • 打赏
  • 举报
回复
strRecv[dwFileLen]=0;这句貌似也不对
应该是strRecv[dwFileLen]=‘\0';
hdg3707 2012-04-04
  • 打赏
  • 举报
回复
画曲线就需要定义画笔,画刷.在选择画笔和画刷时要先保存原来的,用完后现变成原来的.就是这样:
CPen pen,*oldpen;
pen.create();//就是建立画笔,具体函数我忘了,
然后选择画笔:
oldpen=SelectObject(pen);//选择画笔,具体函数也忘了
用完后,再
SelectObject(oldpen);//释放创建的画笔,选择原来的画笔
画刷也一样
yrx1006_c2 2012-04-04
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

int m_ENDTread,这个变量在CPP文件里定义,不要在头文件里定义,其它地方想引用就用:extern int m_ENDTread;
[/Quote]
谢谢您,按照您的建议改了之后,的确没问题了,但是貌似程序执行依旧是会弹出对话框:
Exception code:C0000005 ACCESS_VIOLATION,也不知道怎么了?
真的很感谢楼上们的建议,谢谢你们!
yrx1006_c2 2012-04-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

线程函数里并没发现有申请内存的语句,是不是别的函数里有,另外,你是不是画曲线了,如果是画曲线了,那很可能画曲线时造成的
[/Quote]
您好,我没有申请线程的内存,我是看了网上一片博客是这么实现一个线程的创立的,然后就借鉴过来了,难道还要自己申请内存吗?我界面上画了曲线,请问为什么会有影响?
yrx1006_c2 2012-04-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

内存泄露了
strRecv=new char[dwFileLen+1];
动态申请内存,用完一次后要delete []strRecv
[/Quote]
按照您说的,释放内存后,再运行,还是会有如下错误:Exception code:C0000005 ACCESS_VIOLATION,请问这是怎么回事??ps:我的确有画曲线。
hdg3707 2012-04-03
  • 打赏
  • 举报
回复
new完后你要delete
shn521 2012-04-03
  • 打赏
  • 举报
回复
内存泄露了
strRecv=new char[dwFileLen+1];
动态申请内存,用完一次后要delete []strRecv
hdg3707 2012-04-03
  • 打赏
  • 举报
回复
线程函数里并没发现有申请内存的语句,是不是别的函数里有,另外,你是不是画曲线了,如果是画曲线了,那很可能画曲线时造成的
yrx1006_c2 2012-04-03
  • 打赏
  • 举报
回复
您好,我再把这两函数的代码贴上;

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();

}
shn521 2012-04-03
  • 打赏
  • 举报
回复
dlg->DataStore();
dlg->DataFitResult();
这两个函数怎么实现的

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧