11560|2

73

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

EVC应用程序在DEBUG下运行提示assertion failed "wincore.cpp line 1051" [复制链接]

EVC应用程序在DEBUG下运行提示assertion failed "wincore.cpp line 1051" 这个怎么解决呢?按放弃退出程序,忽略&重试程序不能正常运行。程序大概的思路是建立一个线程不断采集串口数据。当判断数据不满足要求时,在线程中弹出对话框修改参数,用了代码是
CElectriWeight DlgWork;
DlgWork.DoModal();
单步跟踪了下,DlgWork窗体的OnInitDialog()都可以运行结束,回调完成后,出现上述提示。
怀疑DlgWork窗体有指针操作失误,自己又做了简单的窗体,还是提示。

是不是线程中弹出对话框是不安全的?希望达人赐教!给点提示!

最新回复

谢谢指点 我看了下wincore.cpp文件1051行 void CWnd::AssertValid() const {         if (m_hWnd == NULL)                 return;     // null (unattached) windows are valid         // check for special wnd??? values         ASSERT(HWND_TOP == NULL);       // same as desktop         if (m_hWnd == HWND_BOTTOM)                 ASSERT(this == &CWnd::wndBottom);         else if (m_hWnd == HWND_TOPMOST)                 ASSERT(this == &CWnd::wndTopMost);         else if (m_hWnd == HWND_NOTOPMOST)                 ASSERT(this == &CWnd::wndNoTopMost);         else         {                 // should be a normal window                 ASSERT(::IsWindow(m_hWnd));                 // should also be in the permanent or temporary handle map                 CHandleMap* pMap = afxMapHWND();                 ASSERT(pMap != NULL);                 CObject* p;                 ASSERT((p = pMap->LookupPermanent(m_hWnd)) != NULL ||                         (p = pMap->LookupTemporary(m_hWnd)) != NULL);/////LINE1051                 ASSERT((CWnd*)p == this);   // must be us                 // Note: if either of the above asserts fire and you are                 // writing a multithreaded application, it is likely that                 // you have passed a C++ object from one thread to another                 // and have used that object in a way that was not intended.                 // (only simple inline wrapper functions should be used)                 //                 // In general, CWnd objects should be passed by HWND from                 // one thread to another.  The receiving thread can wrap                 // the HWND with a CWnd object by using CWnd::FromHandle.                 //                 // It is dangerous to pass C++ objects from one thread to                 // another, unless the objects are designed to be used in                 // such a manner.         } } 看到了NOTE,我的程序是多线程同步,简单描述下: DWORD WINAPI CCHQThreadDlg::ReadThread1(LPVOID lpvoid)//建立了线程1 CWork DlgWork;DlgWork.DoModal();//在线程1中弹出对话框  报错 大虾能简单解释下上面的NOTE吗?是不是我的对话框被多个线程占用?但是在程序里没有阿   详情 回复 发表于 2007-4-5 11:30
点赞 关注

回复
举报

64

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
具体原因很难说!
单步跟踪进去看看就知道是怎么回事了
追到:wincore.cpp line 1051 这里看
或者打开这个文件的1051行,看看这个位置的断言
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
谢谢指点
我看了下wincore.cpp文件1051行
void CWnd::AssertValid() const
{
        if (m_hWnd == NULL)
                return;     // null (unattached) windows are valid

        // check for special wnd??? values
        ASSERT(HWND_TOP == NULL);       // same as desktop
        if (m_hWnd == HWND_BOTTOM)
                ASSERT(this == &CWnd::wndBottom);
        else if (m_hWnd == HWND_TOPMOST)
                ASSERT(this == &CWnd::wndTopMost);
        else if (m_hWnd == HWND_NOTOPMOST)
                ASSERT(this == &CWnd::wndNoTopMost);
        else
        {
                // should be a normal window
                ASSERT(::IsWindow(m_hWnd));

                // should also be in the permanent or temporary handle map
                CHandleMap* pMap = afxMapHWND();
                ASSERT(pMap != NULL);

                CObject* p;
                ASSERT((p = pMap->LookupPermanent(m_hWnd)) != NULL ||
                        (p = pMap->LookupTemporary(m_hWnd)) != NULL);/////LINE1051
                ASSERT((CWnd*)p == this);   // must be us

                // Note: if either of the above asserts fire and you are
                // writing a multithreaded application, it is likely that
                // you have passed a C++ object from one thread to another
                // and have used that object in a way that was not intended.
                // (only simple inline wrapper functions should be used)
                //
                // In general, CWnd objects should be passed by HWND from
                // one thread to another.  The receiving thread can wrap
                // the HWND with a CWnd object by using CWnd::FromHandle.
                //
                // It is dangerous to pass C++ objects from one thread to
                // another, unless the objects are designed to be used in
                // such a manner.
        }
}
看到了NOTE,我的程序是多线程同步,简单描述下:
DWORD WINAPI CCHQThreadDlg::ReadThread1(LPVOID lpvoid)//建立了线程1
CWork DlgWork;DlgWork.DoModal();//在线程1中弹出对话框  报错
大虾能简单解释下上面的NOTE吗?是不是我的对话框被多个线程占用?但是在程序里没有阿
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表