MFC 静态函数中调用类的成员函数 编译能通过,但运行出错

Zed_1995 2018-07-01 04:22:37
首先在cpp中定义了几个Dialog类的指针,代表几个窗口,这块功能正常 之前正常使用。这次用到的是dlg_AreaInfo 是一个区域切换信息的Dialog。

然后在AreaInfo对话框的头文件中定义了两个函数AreaSend()这个是管理区域信息发送的,AreaTimerThread这个是static的,用于AfxBeginThread创建线程。

之后 在AreaTimerThread中调用了AreaSend()函数,静态函数中调用类的成员函数,通过全局指针实现 = =、这个应该没毛病,之前也一直这么用。



编译可以通过,之后运行就报错了 断在了这个地方

这是为什么呢 是变量定义的问题? 不是很懂 哪位大佬帮忙分析一波
...全文
303 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Zed_1995 2018-07-01
  • 打赏
  • 举报
回复
引用 6 楼 cvbtvbwu 的回复:
首先看对话框的指针是否正常,在线程里断个点,看对话框指针的成员是否正常。

把AreaSend() 函数的东西全注释了,看是否正常


或者说, 在静态函数 中发送更新消息也行
https://www.cnblogs.com/lebronjames/archive/2011/02/16/1956029.html
Zed_1995 2018-07-01
  • 打赏
  • 举报
回复
引用 7 楼 schlafenhamster 的回复:
AfxBeginThread(AFX_THREADPROC(MyThread),this);
直接 传 this 不要 那个 指针

发现问题了,是这个 UpdateData(TRUE)的问题,在static函数中调用这个 编译没错,但是运行出错 ,注释掉就好了。
对话框的成员函数中 开启线程之前UpdateData(TRUE)更新数据就好了!功能正常
Zed_1995 2018-07-01
  • 打赏
  • 举报
回复
引用 6 楼 cvbtvbwu 的回复:
首先看对话框的指针是否正常,在线程里断个点,看对话框指针的成员是否正常。

把AreaSend() 函数的东西全注释了,看是否正常
多谢大佬,发现问题了,是这个 UpdateData(TRUE)的问题,在static函数中调用这个 编译没错,但是运行出错 ,注释掉就好了。
对话框的成员函数中 开启线程之前UpdateData(TRUE)更新数据就好了!功能正常。谢谢
schlafenhamster 2018-07-01
  • 打赏
  • 举报
回复
AfxBeginThread(AFX_THREADPROC(MyThread),this);
直接 传 this 不要 那个 指针
叶恭介叶恭介 2018-07-01
  • 打赏
  • 举报
回复
首先看对话框的指针是否正常,在线程里断个点,看对话框指针的成员是否正常。

把AreaSend() 函数的东西全注释了,看是否正常
Zed_1995 2018-07-01
  • 打赏
  • 举报
回复
引用 4 楼 zhao3132453 的回复:
CString str5[32];
这是想干什么?
这块是CAN发送的代码,不是我写的 我看他代码的意思应该是想把strSendData 发送的字符串(原本是CString类型的),转换成了BYTE buf[]里面,具体怎么操作这块代码我也不太清楚,这个模块是我上某宝上买的 这是他工程带的测试代码 没改过
半雨微凉丶 2018-07-01
  • 打赏
  • 举报
回复
CString str5[32];
这是想干什么?
Zed_1995 2018-07-01
  • 打赏
  • 举报
回复
Zed_1995 2018-07-01
  • 打赏
  • 举报
回复
Zed_1995 2018-07-01
  • 打赏
  • 举报
回复
附上AreaSend()的代码,这是一个用CAN模块的发送的,要是不在静态函数AreaTimerThread中调用 功能是正常的。
void CAreaInfoDialog::AreaSend()
{
///////////////////////////////////////////////////////////////////////////////////
UpdateData(TRUE);
////////////////////////////////// CAN发送 //////////////////////////////////////

//从界面获取发送信息
VCI_CAN_OBJ sendbuf[1];
CString str5[32];
CString m_strSendID;

CString strSendData;
BYTE buf[50];
CString strtemp, strtemp1;
CString str1;
int len, datanum = 0, IDnum = 0, newflag = 1, i;

////////////////////////////////////////////////////////////////////////////////
strSendData.Format(_T("%d"), m_nTimerCount);
//显示 m_strSendID
//AfxGetApp()->GetMainWnd()->SetWindowTextW(m_strSendData);

//
newflag = 1;
len = strSendData.GetLength();
for (i = 0; i<len; i++)
{
strtemp = strSendData.GetAt(i);
if (strtemp == _T(" "))
newflag = 1;
else if (newflag == 1)
{
newflag = 0;
strtemp = strSendData.GetAt(i);
if (i == (len - 1))
{
str5[datanum] = _T("0") + strtemp;
}
else
{
strtemp1 = strSendData.GetAt(i + 1);

if (strtemp1 == _T(" "))
{
str5[datanum] = _T("0") + strtemp;
}
else
str5[datanum] = strtemp + strtemp1;
}
buf[datanum] = Str2Hex(str5[datanum]);
datanum++;
if (datanum >= 8)
break;
}
}

sendbuf->ExternFlag = 0;//标准帧
sendbuf->DataLen = datanum;
sendbuf->RemoteFlag = 0;//数据帧
sendbuf->ID = 0x01;

for (i = 0; i<datanum; i++)
sendbuf->Data[i] = buf[i];

int flag;
flag = VCI_Transmit(4, 0, 1, sendbuf, 1);//CAN message send,通道2
if (flag<1)
{
if (flag == -1)
AfxMessageBox(_T("failed- device not open\n"));
else if (flag == 0)
//MessageBox(_T("send error\n"));
return;
}

m_nTimerCount++;
if (m_nTimerCount > dlg_AreaInfo->m_nWorkingArea + 1)
m_nTimerCount = 1;

m_nSwitchCount++;
UpdateData(FALSE);
/////////////////////////////// END OF CAN SEND //////////////////////////////////////////
}

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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