MFC 多线程用户界面代码出现“file:f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\thrdcore.cpp Line:532”错误分析

利用Visual C++ 2015建立一个MultiThread的对话框,在此对话框基础上添加多线程用户界面线程,多线程程序

命名为“UIThread”,在主线程程序MultiThreadDlg.h中添加线程变量CUIThread *pThread,然后在主线程程序

MultiThreadDlg.cpp中的BOOL CMultiThreadDlg::OnInitDialog()添加pThread的初始化pThread = new CUIThread();

在主线程界面CMultiThreadDlg添加启动线程的按键处理程序OnBnMultiThread(),在按键处理函数创建用户界面线程

void CMultiThreadDlg::OnBnMultiThread()
{
    // TODO: 在此添加控件通知处理程序代码
    pThread->CreateThread();
    pThread->GetMultiDlg(this);
    m_HideWindow.EnableWindow(TRUE);
    m_ShutThread.EnableWindow(TRUE);
    m_Thread.EnableWindow(FALSE);
    //AfxMessageBox(_T("NI"));
}

主线程界面如下图所示:

MFC 多线程用户界面代码出现“file:f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\thrdcore.cpp Line:532”错误分析

其中Thread是启动线程的按键,ShutThread是结束线程的按键,点击Thread启动线程按键,通过ShutThread关闭线程

然后在点击Thread启动线程出现了“file:f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\thrdcore.cpp  Line:532”的错误如下图所示;

MFC 多线程用户界面代码出现“file:f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\thrdcore.cpp Line:532”错误分析

原因分析:因为线程变量CUIThread *pThread在主线程OnInitDialog()中分配内存pThread = new CUIThread(),当第一次

启动用户界面线程 pThread->CreateThread();创建了线程,但是如果第一次ShutThread按键关闭线程之后pThread变量

分配的内存被系统收回,如果再次点击启动按键,则在void CMultiThreadDlg::OnBnMultiThread()按键处理函数中没有再

次分配pThread的内存空间而直接创建线程pThread->CreateThread()则系统出错,所以在创建线程是pThread = new CUIThread()分配空间不应该放在OnInitDialog()初始化函数中,而应直接放在void CMultiThreadDlg::OnBnMultiThread()按

键处理函数内部如下所示:

void CMultiThreadDlg::OnBnMultiThread()
{
    // TODO: 在此添加控件通知处理程序代码

    pThread = new CUIThread()
    pThread->CreateThread();
    pThread->GetMultiDlg(this);
    m_HideWindow.EnableWindow(TRUE);
    m_ShutThread.EnableWindow(TRUE);
    m_Thread.EnableWindow(FALSE);
    //AfxMessageBox(_T("NI"));
}