C++ 工作线程和MFC控件

C++ 工作线程和MFC控件,c++,mfc,controls,worker,C++,Mfc,Controls,Worker,我知道MFC GUI控件不能直接从工作线程访问,但例如,它们通过向该线程传递一个指向拥有控件的对象实例的指针来访问。我的问题是,当我调用工作线程范围内的函数时,我真的很确定它是如何进行的,工作线程需要访问MFC控件。请考虑以下代码: //header: class CMyDlg : public CDialog { ... ... ... afx_msg void OnButtonControl(); static UNIT ControlThread(LPVOID pP

我知道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;
    }
最好的方法是什么

先谢谢你
最好的Greg不要太详细,这里是你应该如何做的。我并没有构建、判断或修改你们的基本代码,我只是解决了你们的线程问题。你应该可以从这里开始

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

您的代码将无法编译。第一个原因是ControlThread函数必须声明为静态。如果
ControlThread
声明为静态,那么您还需要将
validateditcontrol()
更改为
dlg->validateditcontrol()
this->GetDlgItem(IDC\u EDIT\u HELLO)
更改为
GetDlgItem(IDC\u EDIT\u HELLO)
因为
validateditcontrol
是一个成员函数,因此
这个
已经被暗示了。听起来好像整个
静态vs会员
问题确实有些混乱…谢谢你的回答,我为不完整性道歉。刚刚编辑了我的文章。如果您试图从工作线程访问GUI元素,可能会(将会?)发生不好的事情。您应该通过消息通知GUI线程的任何更改,并让GUI线程更新GUI。检查@MikMik,链接中充满了不知情的意见,甚至一点都不好笑。我知道它最近被贴了很多——这并没有使下面的任何部分都正确的工作线程和GUI。在工作线程上使用GUI本身并没有什么问题。向另一个线程拥有的控件发送
WM_GETTEXT
消息也没有什么错。事实上,有很多事情是合法的,甚至是一个窗口层次结构传播多个线程。请不要再发布那个链接,忘记它曾经存在过。