UINT CcosumerDlg::producer(LPVOID pParam)
{
pro();
return 0;
}
void CcosumerDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
pThread=AfxBeginThread(producer,NULL,THREAD_PRIORITY_BELOW_NORMAL,0,0,NULL);
}
提示错误:error C3867: “CcosumerDlg::producer”: 函数调用缺少参数列表;请使用“&CcosumerDlg::producer”创建指向成员的指针
但加了参数也不行啊,难道不能用类内函数作为线程启动函数?该如何解决啊?
{
pro();
return 0;
}
void CcosumerDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
pThread=AfxBeginThread(producer,NULL,THREAD_PRIORITY_BELOW_NORMAL,0,0,NULL);
}
提示错误:error C3867: “CcosumerDlg::producer”: 函数调用缺少参数列表;请使用“&CcosumerDlg::producer”创建指向成员的指针
但加了参数也不行啊,难道不能用类内函数作为线程启动函数?该如何解决啊?
pThread=AfxBeginThread(&CcosumerDlg::producer,NULL,THREAD_PRIORITY_BELOW_NORMAL,0,0,NULL);
细节可以参考msdn.也可以看看windows 核心编程
:CreateThread()建立前需要找到线程入口地址!
http://topic.csdn.net/t/20010516/23/123643.html 对操作系统真正的实现而言,启动一个线程需且只需一个入口地址就可以了。但是你要注意的是,我们提供的所谓控制函数,并不是这个真正的入口点。操作系统启动线程时,总是先调用一些特定的入口代码,这部分代码对线程的运行环境做一定的初始化之后,再调用你的控制函数。由于这些入口代码是在内核中写好了的,所以它所调用得控制函数其原型也是固定的,就是在CreateThread API中声明的那样。因此,在一个封装线程的类里面,实际上控制函数是不是静态的无关紧要,关键的是该类在最终启动线程时,传递给CreateThread函数的控制函数必须符合上述的原型。至于VC的类为什么用静态的控制函数,我想只是为了方便,但这并不说明就不能用非静态函数实现。例如C++Builder中的线程类就没有用到静态控制函数。