2014-02-20 38 views
0

我意识到MFC GUI控件不能直接从工作线程访问,但例如,他们通过传递给此线程指向拥有该控件的对象实例的指针。我的问题是,当我调用需要访问MFC控件的工作线程范围内的函数时,我非常确定它是如何进行的。请考虑以下代码:工作线程和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; 
    } 

这是什么最好的办法?

预先感谢您 最好格雷格

+0

你的代码不会编译。第一个原因是ControlThread函数必须声明为静态。纠正这将导致其他错误,所以你的问题的前提是关闭的。 –

+0

如果'ControlThread'被声明为static,那么你还需要将'ValidateEditControl()'改成'dlg-> ValidateEditControl()'和'this-> GetDlgItem(IDC_EDIT_HELLO)'到'GetDlgItem(IDC_EDIT_HELLO)',因为'ValidateEditControl'是一个成员函数,因此'this'已经暗示。这听起来好像在整个静态和成员问题上存在一些混淆...... – user1793036

+0

谢谢你的回答,我对不完整性表示歉意。刚刚编辑我的帖子。 – GregPhil

回答

-1

没有考虑太多的细节,这里是你应该怎么做。我没有建立,判断或修改你的基本代码,我只是解决了你的线程部分问题。你应该可以从这里拿走它。

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

我会加入这个作为一个评论,但不能回应还:提出的解决方案通过zadane是一样的原代码一样糟糕,并可能导致依赖于你的代码的其余部分死锁,但另外,它并没有真正解决你的问题,你可能只是在主线程中完成它,因为它在概念上是在做什么。

这将有助于如果你能解释一下为什么你需要做在一个线程中的验证,但也许你可以玩的以下想法:

你能赶上变化事件的编辑控件,我假设你已经在做,然后在超时,变化量或者符合你的验证标准的情况下,向工作者线程发送一条消息(通过PostMessage和线程安全/同步或分配缓冲区以使数据得到验证)。验证数据并将消息发送回窗口到用户定义的ON_MESSAGE处理程序(同样,通过PostMessage),让GUI知道验证结果。