我意識到MFC GUI控件不能直接從工作線程訪問,但例如,他們通過傳遞給此線程指向擁有該控件的對象實例的指針。我的問題是,當我調用需要訪問MFC控件的工作線程範圍內的函數時,我非常確定它是如何進行的。請考慮以下代碼:工作線程和MFC控件
//header:
class CMyDlg : public CDialog
{
...
...
...
afx_msg void OnButtonControl();
static UNIT ControlThread(LPVOID pParam);
bool ValidateEditControl();
}
//cpp
void CMyDlg::OnButtonControl()
{
CString Text = "Hello";
GetDlgItem(IDC_EDIT_HELLO)->SetWindowText(Text);
m_hControlThread = AxtBeginThread(ControlThread, this);
}
UINT CMyDlg::ControlThread(LPVOID pParam)
{
CMyDlg *dlg = (CMyDlg*) pParam;
CString Text = "Hello";
while(SomethingIsTrue) {
bool Ret = dlg->ValidateEditControl();
if (!Ret) //Someone changed ControlEntry -> change it back
dlg->GetDlgItem(IDC_EDIT_HELLO)->SetWindowText(Text);
}
AfxEndThread(0);
}
bool CMyDlg::ValidateEditControl()
{
CString Text;
this->GetDlgItem(IDC_EDIT_HELLO)->GetWindowText(Text); // do I need the "this" pointer here, or for general how do I access my MFC control at this point?
if (Text == "Hello")
return true;
else
return false;
}
這是什麼最好的辦法?
預先感謝您 最好格雷格
你的代碼不會編譯。第一個原因是ControlThread函數必須聲明爲靜態。糾正這將導致其他錯誤,所以你的問題的前提是關閉的。 –
如果'ControlThread'被聲明爲static,那麼你還需要將'ValidateEditControl()'改成'dlg-> ValidateEditControl()'和'this-> GetDlgItem(IDC_EDIT_HELLO)'到'GetDlgItem(IDC_EDIT_HELLO)',因爲'ValidateEditControl'是一個成員函數,因此'this'已經暗示。這聽起來好像在整個靜態和成員問題上存在一些混淆...... – user1793036
謝謝你的回答,我對不完整性表示歉意。剛剛編輯我的帖子。 – GregPhil