我意识到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