非静态成员引用必须相对于特定对象
a non static member reference must be relative to a specific object
我一直在构建一个简单的应用程序,它需要一个单独的线程来在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";
文本框更新!
- 对于BTreeMap和其他依赖于Ord的东西,是否有等效于C++比较器对象?
- 当两个 std::map 对象相同时
- unique_ptr相对于shared_ptr的优势是什么
- int 相对于C++中主代码的目的
- SourceAddress 是否相对于 MmCopyVirtualMemory 中的 SourceProcess?
- 对象销毁对于加密目的可靠吗?
- 相对于类statics的基元全局的生存期
- 实现现有的网络接口,以相对于C 11中的Endianess定义位字段
- 如何添加相对于QTABBAR中标签的位置的小部件
- 相对于 3D 应用程序中的 Windows 消息循环的计时错误
- §12.3.2 [class.conv.fct]/1 in C++1z 相对于 C++14 发生了重大变化。有意义吗?
- 相对于 cpp 不工作目录的路径
- 访问本地对象(相同类类型)的私有成员
- 使用原生C++Qt相对于PyQt有什么优势?
- 打开相对于chromium.exe的文件
- msvcr100相对于msvcrt的优势
- at()函数相对于get(ch)的必要性
- unique_ptr相对于auto_ptr的优点
- c++中std::thread相对于pthread的优势
- 哈希,相对于x,y位置的多边形