VC多线程如何访问其他的类函数和类成员变量

时间:2022-12-12 18:07:59
我新建了一个MFC AppWizard(exe)基于对话框的工程。在这个对话框类中,有一些成员函数,和成员变量。
我又定义了一个多线程,是基于对话框类定义的,所以就定义成了static类型的,但是我不知道如何来访问其他的成员函数和变量。
请高手指点,谢谢!

25 个解决方案

#1


传递你要访问的类的指针进去.
然后就直接能访问成员变量了

#2


一般都这样做.
#include<windows.h>
#include<stdio.h>
#include<process.h>

class test
{
int mx;
public:
test(int x):mx(x){}
static unsigned int __stdcall threadProc(void* pV)
{
test* p = (test*)pV;
p->func();
return 0;
}
void func()
{
printf("%d\n",mx);
}
};


int main()
{
test x(10);
_beginthreadex(0,0,test::threadProc,(void*)&x,0,0);
Sleep(100);
    return 0;
}

#3


启动线程的时候传递this指针,static线程函数里转换成类指针使用

#4


传递类指针

#5


楼主问得问题太不清晰了。MFC的多线程可是挺有讲究的。

#6


创建线程时把对话框类指针作为线程参数传过去,在线程函数中将参数强制转换为对话框类指针类型,然后用这个指针访问类的非静态成员。

#7


引用 1 楼 akirya 的回复:
传递你要访问的类的指针进去. 
然后就直接能访问成员变量了

一般都把this指针作为线程参数传递给线程函数

#8


CMYDlg::OnInitDialog
{.....
HANDLE hThread=AfxBeginThread((AFX_THREADPROC)ThreadProc,(LPVOID *)this,THREAD_PRIORITY_NORMAL,0,0,NULL);
CloseHandle(hThread);
return(true);
}


DWORD WINAPI CMyDlg::ThreadProc(LPVOID lpParameter)
{
   CMyDlg * pt=(CMyDlg *)lpParameter;
   pt->Sample();
   return(0);
}
编译没有错误,运行是产生错误

#9


(LPVOID *)this ......
LPVOID已经是指针了

运行什么错误?

#10


调用成员变量可以,调用成员函数在运行时报错

#11


感觉是因为成员函数里有对其他变量操作的原因,但我不太确定,是访问地址错误

#12


线程访问成员函数是受限制的,Sample里面干了哪些事?

#13


使对话框的文本框内容进行更新,对chart控件进行绘制波形操作

#14


线程访问成员函数都受哪些现在?

#15


线程访问成员函数都受哪些限制?

#16


很不幸,窗口操作受到限制,尤其是涉及到窗口绘制的操作。窗口绘制必须由窗口过程所在线程来完成,不能在其它线程中直接绘制,其它线程应该仅仅处理数据,然后可以通过发消息的方式通知窗口线程来进行绘制操作。

#17


多线程数据安全问题啊。
多个线程共用的数据,得加锁啊。

#18


看来不是件容易解决的问题了,jameshooo愿意继续帮助我吗?我的QQ616737061

#19


谢谢大家的帮忙,给分了

#20


我的经验是用自定义消息的方式进行界面更新

#21


ggg

#22


传递指针

注意同步

#23


void mythread(void * p)
{
  HWND hWnd = (HWND)p;
::SendMessage(hWnd,WM_USER,(WPARAM)"Hello World",0);
}

class myclass: CWnd
{
protected:
  CStatic m_mystatic;
public:
  DECLARE_MESSAGE_MAP()
  LRESULT afx_msg OnTest(WPARAM wPar,LPARAM lPar)
{
 const char * msg = (const char *)wPar;
m_mystatic.SetWindowText(msg);
UpdateData(FALSE);
return S_OK;
}
void beginthread()
{
  AfxBeginThread(mythread,(void*)this->GetSafeHwnd(),THREAD_PRIORITY_NORMAL,0,0,NULL); 
}
}

#24


http://www.zzGps.cn 在线技术视频 

http://bbs.ZzGps.Cn 技术视频下载 

技术视频提供,分类清晰,技术覆盖面广,几千视频助您轻松学习 

#25


学习了

#1


传递你要访问的类的指针进去.
然后就直接能访问成员变量了

#2


一般都这样做.
#include<windows.h>
#include<stdio.h>
#include<process.h>

class test
{
int mx;
public:
test(int x):mx(x){}
static unsigned int __stdcall threadProc(void* pV)
{
test* p = (test*)pV;
p->func();
return 0;
}
void func()
{
printf("%d\n",mx);
}
};


int main()
{
test x(10);
_beginthreadex(0,0,test::threadProc,(void*)&x,0,0);
Sleep(100);
    return 0;
}

#3


启动线程的时候传递this指针,static线程函数里转换成类指针使用

#4


传递类指针

#5


楼主问得问题太不清晰了。MFC的多线程可是挺有讲究的。

#6


创建线程时把对话框类指针作为线程参数传过去,在线程函数中将参数强制转换为对话框类指针类型,然后用这个指针访问类的非静态成员。

#7


引用 1 楼 akirya 的回复:
传递你要访问的类的指针进去. 
然后就直接能访问成员变量了

一般都把this指针作为线程参数传递给线程函数

#8


CMYDlg::OnInitDialog
{.....
HANDLE hThread=AfxBeginThread((AFX_THREADPROC)ThreadProc,(LPVOID *)this,THREAD_PRIORITY_NORMAL,0,0,NULL);
CloseHandle(hThread);
return(true);
}


DWORD WINAPI CMyDlg::ThreadProc(LPVOID lpParameter)
{
   CMyDlg * pt=(CMyDlg *)lpParameter;
   pt->Sample();
   return(0);
}
编译没有错误,运行是产生错误

#9


(LPVOID *)this ......
LPVOID已经是指针了

运行什么错误?

#10


调用成员变量可以,调用成员函数在运行时报错

#11


感觉是因为成员函数里有对其他变量操作的原因,但我不太确定,是访问地址错误

#12


线程访问成员函数是受限制的,Sample里面干了哪些事?

#13


使对话框的文本框内容进行更新,对chart控件进行绘制波形操作

#14


线程访问成员函数都受哪些现在?

#15


线程访问成员函数都受哪些限制?

#16


很不幸,窗口操作受到限制,尤其是涉及到窗口绘制的操作。窗口绘制必须由窗口过程所在线程来完成,不能在其它线程中直接绘制,其它线程应该仅仅处理数据,然后可以通过发消息的方式通知窗口线程来进行绘制操作。

#17


多线程数据安全问题啊。
多个线程共用的数据,得加锁啊。

#18


看来不是件容易解决的问题了,jameshooo愿意继续帮助我吗?我的QQ616737061

#19


谢谢大家的帮忙,给分了

#20


我的经验是用自定义消息的方式进行界面更新

#21


ggg

#22


传递指针

注意同步

#23


void mythread(void * p)
{
  HWND hWnd = (HWND)p;
::SendMessage(hWnd,WM_USER,(WPARAM)"Hello World",0);
}

class myclass: CWnd
{
protected:
  CStatic m_mystatic;
public:
  DECLARE_MESSAGE_MAP()
  LRESULT afx_msg OnTest(WPARAM wPar,LPARAM lPar)
{
 const char * msg = (const char *)wPar;
m_mystatic.SetWindowText(msg);
UpdateData(FALSE);
return S_OK;
}
void beginthread()
{
  AfxBeginThread(mythread,(void*)this->GetSafeHwnd(),THREAD_PRIORITY_NORMAL,0,0,NULL); 
}
}

#24


http://www.zzGps.cn 在线技术视频 

http://bbs.ZzGps.Cn 技术视频下载 

技术视频提供,分类清晰,技术覆盖面广,几千视频助您轻松学习 

#25


学习了