非静态成员引用必须相对于特定对象

a non static member reference must be relative to a specific object

本文关键字:对象 相对于 静态成员 引用      更新时间:2023-10-16

我一直在构建一个简单的应用程序,它需要一个单独的线程来在while循环中运行一些后台代码。我有一个文本框,我想从单独线程中运行的代码向其发送消息,但我无法这样做。

非静态成员引用必须相对于特定对象。根据我的理解,要运行一个额外的线程,似乎我必须使该功能static.但是,当我尝试向m_Console写消息时,我看到错误:

非静态成员引用必须相对于特定对象。

我尝试初始化对象,但它没有做任何事情。

CMFCApplication1Dlg  obj;
obj.m_Console = "Test"
  • 使用单独线程的代码是:static UINT checkSomething(LPVOID pParam);

  • 文本框变量为:CString m_Console;

void CMFCApplication1Dlg::OnBnClickedBtnAdd(){
m_Console = "Parser is now running..";
AfxBeginThread(checkSomething,"");

我已经尝试了这个建议:

UINT CMFCApplication1Dlg::checkSomething(LPVOID pParam){
CMFCApplication1Dlg* pObject = (CMFCApplication1Dlg*)pParam;
pObject->m_Console = "I am in thread";

但它会在以下位置引发访问冲突错误:pObject->m_Console = "I am in thread";

在 MFCApplication1.exe 中0x0FE90DBD (mfc140ud.dll( 引发异常: 0xC0000005:访问冲突读取位置0xFFFFFFFC。

这是代码:

MFCApplication1Dlg.cpp

void CMFCApplication1Dlg::OnBnClickedBtnAdd(){      

m_Console = "Something Parser is now running..";
AfxBeginThread(checkSomething,"");
CWnd* okbtn = GetDlgItem(IDC_BTN_ADD);
if (okbtn) {
okbtn->EnableWindow(FALSE);
}
// without UpdateData() status area will _NOT_ be updated.
UpdateData(FALSE);}

INT CMFCApplication1Dlg::checkSomething(LPVOID pParam){
CMFCApplication1Dlg* pObject = (CMFCApplication1Dlg*)pParam;
pObject->m_Console = "I am in thread";

MFCApplication1Dlg.h

public:
afx_msg void OnBnClickedBtnAdd();
static int messenger();
static UINT checkSomething(LPVOID pParam);
CString m_Console;

文本框:IDC_Console

  • 类别:价值
  • 访问:公共
  • 控制类型:LText
  • 姓名: m_Console
  • 变量类型:CString

从阅读每个人的评论来看,似乎这是我不应该在C++做的事情,问题是,如果我有一个后台任务在需要更新 UI 上的状态框的单独线程中运行循环怎么办?对我来说,这似乎是有人可能希望做的合乎逻辑的事情,但如果我不应该这样做,那么该怎么做?我在单独的线程中运行任务,因为它使用 while 循环,如果我不使用单独的线程,它只会冻结整个应用程序。

您可以将 CMFCApplication1Dlg 的对象作为 Thread 函数的参数传递。

例如

UINT MyThreadProc( LPVOID pParam )
{
CMFCApplication1Dlg * pObject = (CMFCApplication1Dlg *)pParam;
pObject->m_Console = "I am in thread";
}
// .... .... ... 
AfxBeginThread(MyThreadProc, this);

我希望这个答案对你有用。

已更改

AfxBeginThread(checkSomething,""); to
AfxBeginThread(checkSomething,this);

正如YSK Silver所建议的那样,谢谢!

我需要添加一个计时器函数,我遵循了这篇文章: https://www.tutorialspoint.com/mfc/mfc_multithreading.htm

完成此操作后,UI 框将更新。

int currValue;int maxValue;BOOL stopNow;string output;

BEGIN_MESSAGE_MAP(CMFCApplication1Dlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_ERASEBKGND()
ON_WM_CTLCOLOR()
ON_WM_TIMER()  //TIMER
ON_BN_CLICKED(IDC_BTN_ADD, &CMFCApplication1Dlg::OnBnClickedBtnAdd)

END_MESSAGE_MAP((

void CMFCApplication1Dlg::OnTimer(UINT_PTR nIDEvent) {
CDialogEx::OnTimer(nIDEvent);
UpdateData(FALSE);}
void CMFCApplication1Dlg::OnBnClickedBtnAdd(){      
SetTimer(1234, 333, 0); // 3 times per second
m_Console = "Parser is now running..";
AfxBeginThread(checkSomething,this);

然后,我可以更改 checkSomething 方法中的文本:

CMFCApplication1Dlg* pObject = (CMFCApplication1Dlg*)pParam;
output = "I am in thread";
pObject->messenger(output);
//OR
pObject->m_Console = "I am in thread";

文本框更新!