非静态成员引用必须相对于特定对象
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"
使用独立线程的代码是:
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";
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
- 类别:价值
- 访问:public
- 控件类型: 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";
文本框更新!
我一直在构建一个简单的应用程序,它需要一个单独的线程来 运行 while
循环中的一些后台代码。我有一个文本框,我想在单独的线程中从代码 运行ning 向其发送消息,但是我不能。
非静态成员引用必须与特定对象相关。根据我对 运行 一个额外线程的理解,我似乎必须创建函数 static
。但是,当我尝试向 m_Console
发送消息时,我看到错误:
A non static member reference must be relative to a specific object.
我尝试初始化该对象,但它没有执行任何操作。
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";
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
- 类别:价值
- 访问:public
- 控件类型: 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";
文本框更新!