簡體   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