【问题标题】:MFC - UpdateData(False) + Thread + Debug assertion failedMFC - UpdateData(False) + 线程 + 调试断言失败
【发布时间】:2014-05-30 09:59:10
【问题描述】:

我使用 Visual Studio 2010,使用 MFC 2008/2010。 我对 THREAD 和 UPDATEDATA(FALSE) 有疑问 这是初始化函数

BOOL CBkav_btap2_appDlg::OnInitDialog(){
     ....
     AfxBeginThread (MyThreadProc,(LPVOID)GetSafeHwnd());
     return TRUE;  // return TRUE  unless you set the focus to a control

}

这是我的主题

UINT __cdecl MyThreadProc( LPVOID pParam )
{
    DWORD totalphys;
    DWORD availablephys;
    DWORD memoload;
    CBT2Class* pObject = (CBT2Class*)pParam;
    pObject->GetRAMandCPUInfo(totalphys,availablephys,memoload  );
    CBkav_btap2_appDlg dlgObject;
    dlgObject.ec_totalphys = totalphys;

    dlgObject.UpdateData(FALSE);<--- Can not update data
    return 0;   
}

CBT2Class 是我之前创建的 dll 文件中的类。 ec_totalphys 只是一个编辑控件。 当我运行时,它返回“Debud Assertion failed”。我不知道为什么。请帮我。谢谢。 p/s:我想我需要使用 SendMessage 来更新 Dialog 的数据,但我到处搜索但仍然无法工作。

【问题讨论】:

  • UpdateData 旨在通过对话框的控件验证和交换数据值。你的对话框甚至还没有存在(作为一个窗口),更不用说它的任何控件了。您的断言失败的停止点可能会向您展示这一点(如果您发布了它,我们也会看到,但您没有发布)。我认为您甚至不需要本地的dlgObject。看来您想更新最初启动此线程的对话框。

标签: c++ multithreading visual-studio-2010 mfc


【解决方案1】:

您将 HWND 作为线程参数传递。它不是一个指针,你不应该把它转换成任何东西。您可以使用 HWND 将自定义消息发布到对话框。此自定义消息可以包含 wParam 和 lParam 中的数据。对话框中的消息处理程序在主线程中运行并且可以执行 UpdateData 调用。请参阅此处的示例以将自定义消息发布到对话框:http://vcfaq.mvps.org/mfc/12.htm

【讨论】:

    【解决方案2】:

    好的。谢谢大家的建议:D。 所以我的特殊解决方案是:

    B1。定义了一个 MESSAGE

    #ifdef _DEBUG
    #define new DEBUG_NEW
    #define WM_MY_MESSAGE (WM_USER+1000) // Cho chay o 2 thoi diem khac nhau 
    #endif
    

    B2。已登录 MESSAGE MAP

    BEGIN_MESSAGE_MAP(CBkav_btap2_appDlg, CDialogEx)
        ON_WM_SYSCOMMAND()
        ON_WM_PAINT()
        ON_WM_QUERYDRAGICON()
        ON_MESSAGE(WM_MY_MESSAGE, TestMessageCall)
        ON_WM_TIMER()
    END_MESSAGE_MAP()
    

    B33。创建线程

    BOOL CBkav_btap2_appDlg::OnInitDialog()
    {
        ..
    
        // TODO: Add extra initialization here
    
        AfxBeginThread(TestMethodThreadCall, (LPVOID)GetSafeHwnd());
        return TRUE;  // return TRUE  unless you set the focus to a control
    }
    

    B4。创建方法

    UINT __cdecl TestMethodThreadCall( LPVOID pParam )
    {
        while(1){
             //Ten Chuong trinh dc su dung nhieu nhat 
            HWND hDlg = (HWND )pParam;
            CString nameTestMessage = __T("Call From Message");
            ::SendMessage(hDlg, WM_MY_MESSAGE, (WPARAM)(&nameTestMessage), 0);          
            Sleep(5000);
        }
        return 0;
    }
    

    B5。创建方法消息调用

    LRESULT CBkav_btap2_appDlg::TestMessageCall(WPARAM wpD, LPARAM lpD)
    {
        CString *pwpD = (CString *)wpD;
        ec_nameTestmessage  = *pwpD;
        UpdateData(FALSE);
        return LRESULT();
    }
    

    【讨论】:

    • 不要使用WM_USER 范围内的消息。这些是为窗口类实现保留的。应用程序私人消息应在WM_APP 范围内。
    • 欧姆。谢谢。我明白了:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多