简体   繁体   中英

Worker threads and MFC controls

I'm aware of the fact that MFC GUI controls are not accessible directly from a worker thread, but for example, they getting by passing to this thread a pointer to the object instance that owns the controls. My problem is, that I'm really sure about how it goes when I'm calling functions within the scope of the worker thread, which needs to access MFC controls. Please consider the following code:

//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;
    }

What is the best way to this?

Thank you in advance best Greg

Without going into too much details, here is how you should do it. I have't build, judged or modified your basic code, I have just addressed your threading part of question. You should be able to take it from here.

UINT CMyDlg::ControlThread(LPVOID pParam)
{
  HWND hWnd = (HWND) pParam;
  CString Text = "Hello";
  while(SomethingIsTrue) {
    bool Ret = SendMessage(HwND, VALIDATE_CONTROL,0,0 );
    if (!Ret) //Someone changed ControlEntry -> change it back
     SendMessage(CHANGE_EDIT_HELLO, &Text, 0);
  }
  AfxEndThread(0);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM