![](https://iknow-base.cdn.bcebos.com/lxb/notice.png)
MFC如何在自定义函数中调用控件变量
我做的是生产者—消费者问题,要在线程起点函数DWORDWINAPIProducer(LPVOIDlpPara)中输出信息到编辑框控件,但调试时无法引用,怎么做啊?...
我做的是生产者—消费者问题,要在线程起点函数DWORD WINAPI Producer(LPVOID lpPara)中输出信息到编辑框控件,但调试时无法引用,怎么做啊?
展开
2个回答
展开全部
线程函数要定义为控件所在的父窗口类的“静态成员函数”,其参数要给定为该窗口类的对象指针,在调用CreateThread创建线程时,由于线程函数的参数不是 void*,所以需将线程函数强制为 LPTHREAD_START_ROUTINE 类型,在线程函数里,可以通过参数传递进来的窗口指针访问其中的控件了。
例:
class CMyDialog : public CDialog { // 窗口类
...
CEdit m_edtMyEdit; // 编辑框控件对象
static DWORD WINAPI MyThreadRoutine (CMyDialog* pMyDialog); // 线程函数(静态成员函数),参数为窗口类指针
...
};
DWORD WINAPI CMyDialog::MyThreadRoutine (CMyDialog* pMyDialog) // 线程函数
{
...
pMyDialog->m_edtMyEdit.SetWindowText("MyEdit"); // 通过pMyDialog访问成员
...
}
可以在OnInitDialog中或合适的时机创建线程:
CreateThread (..., // 线程安全属性
..., // 栈大小
LPTHREAD_START_ROUTINE(MyThreadRoutine), // 线程函数,注意强制
this, // 线程函数的参数,必须是窗口类的对象指针,this就可以了。
..., // 线程创建属性
...); // 线程ID
例:
class CMyDialog : public CDialog { // 窗口类
...
CEdit m_edtMyEdit; // 编辑框控件对象
static DWORD WINAPI MyThreadRoutine (CMyDialog* pMyDialog); // 线程函数(静态成员函数),参数为窗口类指针
...
};
DWORD WINAPI CMyDialog::MyThreadRoutine (CMyDialog* pMyDialog) // 线程函数
{
...
pMyDialog->m_edtMyEdit.SetWindowText("MyEdit"); // 通过pMyDialog访问成员
...
}
可以在OnInitDialog中或合适的时机创建线程:
CreateThread (..., // 线程安全属性
..., // 栈大小
LPTHREAD_START_ROUTINE(MyThreadRoutine), // 线程函数,注意强制
this, // 线程函数的参数,必须是窗口类的对象指针,this就可以了。
..., // 线程创建属性
...); // 线程ID
更多追问追答
追问
CreatThread的MyThreadRoutine找不到,未定义?
追答
MyThreadRoutine是窗口类的静态成员函数啊,你调用CreateThread时,必须在该类的作用域内,例如对话框的OnInitDialog函数里。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
将对象传进去
更多追问追答
追问
怎么传啊?具体些,在哪里加上什么代码,菜鸟一个,求教啊
追答
你在CreateThread的时候第四个参数是可以穿入一个参数,然后你的DWORD WINAPI Producer(LPVOID lpPara)中LPVOID lpPara是接受到这个参数,你可以在CreateThread的时候传入一个this指针
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询