工作线程和MFC控件

时间:2014-02-20 18:43:55

标签: c++ mfc controls worker

我知道MFC GUI控件不能直接从工作线程访问,但是例如,他们通过向该线程传递指向拥有控件的对象实例的指针。我的问题是,当我在工作线程范围内调用函数时,我确实知道它是怎么回事,它需要访问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;
    }

最好的方法是什么?

提前谢谢你 最好的格雷格

1 个答案:

答案 0 :(得分:0)

如果没有太多详细信息,请按照以下方法进行操作。我没有构建,判断或修改您的基本代码,我刚刚解决了您的线程部分问题。你应该可以从这里拿走它。

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