繁体   English   中英

工作线程和MFC控件

[英]Worker threads and MFC controls

我知道以下事实:无法直接从工作线程访问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;
    }

最好的方法是什么?

预先感谢您,格雷格

无需过多讨论,这里就是您应该如何做。 我没有构建,判断或修改您的基本代码,我只是解决了您的线程部分问题。 您应该可以从这里拿走它。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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