MFC - UpdateData(False)+ Thread + Debug断言失败

时间:2014-05-30 09:59:10

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

我正在使用Visual Studio 2010,使用MFC 2008/2010。 我有THREAD和UPDATEDATA的问题(FALSE) 这是init函数

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只是一个edit_control。 当我跑步时,它返回&#34; Debud Assertion失败&#34;。我不知道为什么。请帮我。 Thankss。 p / s:我想我需要使用SendMessage来更新Dialog的数据,但我会搜索每个地方但仍无法工作。

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

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

B1。定义了一个消息

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

B2。签署了一个消息地图

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();
}