我正在使用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的数据,但我会搜索每个地方但仍无法工作。
答案 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();
}