我又定义了一个多线程,是基于对话框类定义的,所以就定义成了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
一般都把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);
}
编译没有错误,运行是产生错误
{.....
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已经是指针了
运行什么错误?
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);
}
}
{
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 技术视频下载
技术视频提供,分类清晰,技术覆盖面广,几千视频助您轻松学习
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
一般都把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);
}
编译没有错误,运行是产生错误
{.....
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已经是指针了
运行什么错误?
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);
}
}
{
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 技术视频下载
技术视频提供,分类清晰,技术覆盖面广,几千视频助您轻松学习
http://bbs.ZzGps.Cn 技术视频下载
技术视频提供,分类清晰,技术覆盖面广,几千视频助您轻松学习
#25
学习了