C++ VS2008中的断言,而不是VS2005中的断言

C++ VS2008中的断言,而不是VS2005中的断言,c++,visual-studio,mfc,assertions,C++,Visual Studio,Mfc,Assertions,从VS2005切换到VS2008 SP1后,我发现了一个无法解释的问题。 在VS2005下,程序在发布和调试模式下都能正常工作。在VS2008下,当进入调试器时,将引发断言。 如果我让程序运行(在调试或发布模式下),则根本没有断言 我花了将近两天的时间在这件事上,我不明白我做错了什么 程序说明: 我有一个基于MFC对话框的程序,它创建了一个用户线程(CWinThread),用于创建应用程序的主对话框。 工作线程无限循环,并每秒向对话框发布一条消息。消息在gui线程中处理 我的代码的某些部分: g

从VS2005切换到VS2008 SP1后,我发现了一个无法解释的问题。
在VS2005下,程序在发布和调试模式下都能正常工作。在VS2008下,当进入调试器时,将引发断言。
如果我让程序运行(在调试或发布模式下),则根本没有断言

我花了将近两天的时间在这件事上,我不明白我做错了什么

程序说明: 我有一个基于MFC对话框的程序,它创建了一个用户线程(CWinThread),用于创建应用程序的主对话框。
工作线程无限循环,并每秒向对话框发布一条消息。消息在gui线程中处理

我的代码的某些部分:

gui线程的初始化实例:

BOOL CGraphicalThread::InitInstance()
{
    CGUIThreadDlg* pDlg = new CGUIThreadDlg();
    pDlg->Create(CGUIThreadDlg::IDD);
    m_pMainWnd = pDlg;
    AfxGetApp()->m_pMainWnd = pDlg;
    return TRUE;
}
工作线程:

UINT ThreadProc(LPVOID pVoid)
{
    do
    {
        AfxGetApp()->m_pMainWnd->PostMessage(WM_APP+1, (WPARAM)new CString("Hello"), NULL);
        Sleep(1000);
    }
    while(!bStopThread);

    return 0;
}
对话框消息处理程序如下所示:

LRESULT CGUIThreadDlg::OnMsg(WPARAM wp, LPARAM lp)
{
    CListBox* pList = (CListBox*)GetDlgItem(IDC_LIST1);
    CString* ps = (CString*)wp;
    pList->InsertString(-1, *ps);
    delete ps;
    return 1L;
}
这在VS2005中工作得非常好。 但是在VS2008中,只要设置一个断点并进入调试模式,我就会发出一个断言???
wincore.cpp线路906

CObject* p=NULL;
if(pMap)
{
      ASSERT( (p = pMap->LookupPermanent(m_hWnd)) != NULL ||
              (p = pMap->LookupTemporary(m_hWnd)) != NULL);
}
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.
如果我删除GUI线程并将对话框创建到CWinApp线程中,那么问题就不会再发生了

有人知道吗?
我做错什么了吗


谢谢你

@Ismael:我已经试过了,断言仍然被触发。我发现删除断言的唯一方法是在CWinApp线程中创建对话框。
// 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.
但这并不能解释发生了什么,因为仍然有工作线程每秒都会发布到对话框中。 无论如何,谢谢

@daanish.rumani:我检查了wincore.cpp和CWnd::AssertValid()是完全相同的(但是在其余的文件中有很多不同)

我会接受一段代码与VS2005一起工作,而不是VS2008,但是

  • 我看不出我做错了什么。 如果我做错了什么,正确的方法是什么
  • 为什么只有在遇到断点并且我跳过睡眠调用时才会触发断言? 我可以很好地运行这个程序,即使它是在调试模式下编译的,只要我不进入调试器。 这可能是调试器中的错误吗

  • @伊斯梅尔:我已经试过了,断言仍然被激发。我发现删除断言的唯一方法是在CWinApp线程中创建对话框。 但这并不能解释发生了什么,因为仍然有工作线程每秒都会发布到对话框中。 无论如何,谢谢

    @daanish.rumani:我检查了wincore.cpp和CWnd::AssertValid()是完全相同的(但是在其余的文件中有很多不同)

    我会接受一段代码与VS2005一起工作,而不是VS2008,但是

  • 我看不出我做错了什么。 如果我做错了什么,正确的方法是什么
  • 为什么只有在遇到断点并且我跳过睡眠调用时才会触发断言? 我可以很好地运行这个程序,即使它是在调试模式下编译的,只要我不进入调试器。 这可能是调试器中的错误吗

  • 是的,我知道。我不是在另一个线程中操作窗口,只是在其中发布消息。我试过使用原始的HWND,但问题仍然存在。无论如何,它没有解释为什么它可以与VS2005一起工作,而不是与VS2008一起工作。wincore.cpp与VC++版本8和9不同。版本8是VS 2005,版本9是VS 2008I建议将HWND作为线程参数从主对话框传递,然后在线程调用CWnd::FromHandle(HWND)->PostMessage(…);是的,我知道。我不是在另一个线程中操作窗口,只是在其中发布消息。我试过使用原始的HWND,但问题仍然存在。无论如何,它没有解释为什么它可以与VS2005一起工作,而不是与VS2008一起工作。wincore.cpp与VC++版本8和9不同。版本8是VS 2005,版本9是VS 2008I建议将HWND作为线程参数从主对话框传递,然后在线程调用CWnd::FromHandle(HWND)->PostMessage(…);理想情况下,你应该编辑你的原始问题来增加这些精确性。答案是给别人的:)是的。除非你自己真的找到了答案,否则不要发布答案。只需在其他人的答案或评论下方编辑您的问题和/或评论。对不起,我会小心的。理想情况下,您应该编辑原始问题以添加这些精确性。答案是给别人的:)是的。除非你自己真的找到了答案,否则不要发布答案。只需在其他人的答案或评论下方编辑您的问题和/或评论。很抱歉,我会注意的