C++ 工作线程和MFC控件
我知道MFC GUI控件不能直接从工作线程访问,但例如,它们通过向该线程传递一个指向拥有控件的对象实例的指针来访问。我的问题是,当我调用工作线程范围内的函数时,我真的很确定它是如何进行的,工作线程需要访问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
//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
消息也没有什么错。事实上,有很多事情是合法的,甚至是一个窗口层次结构传播多个线程。请不要再发布那个链接,忘记它曾经存在过。