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

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

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

非静态成员引用必须与特定对象相关。根据我对 运行 一个额外线程的理解,我似乎必须创建函数 static。但是,当我尝试向 m_Console 发送消息时,我看到错误:

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

我尝试初始化该对象,但它没有执行任何操作。

CMFCApplication1Dlg  obj;
obj.m_Console = "Test"
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";

Exception thrown at 0x0FE90DBD (mfc140ud.dll) in MFCApplication1.exe: 0xC0000005: Access violation reading location 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

从阅读每个人的评论来看,这似乎是我不应该在 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";

文本框更新!