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”创建指向成员的指针
但加了参数也不行啊,难道不能用类内函数作为线程启动函数?该如何解决啊?

解决方案 »

  1.   

    在类中声明为 static UINT producer(LPVOID pParam)然后
    pThread=AfxBeginThread(&CcosumerDlg::producer,NULL,THREAD_PRIORITY_BELOW_NORMAL,0,0,NULL); 
      

  2.   

    要用静态函数,
        细节可以参考msdn.也可以看看windows  核心编程
      

  3.   

    我有查了查,应该是 之可以是静态函数或全局函数
    :CreateThread()建立前需要找到线程入口地址!
      

  4.   

    更详细的说明:
    http://topic.csdn.net/t/20010516/23/123643.html 对操作系统真正的实现而言,启动一个线程需且只需一个入口地址就可以了。但是你要注意的是,我们提供的所谓控制函数,并不是这个真正的入口点。操作系统启动线程时,总是先调用一些特定的入口代码,这部分代码对线程的运行环境做一定的初始化之后,再调用你的控制函数。由于这些入口代码是在内核中写好了的,所以它所调用得控制函数其原型也是固定的,就是在CreateThread   API中声明的那样。因此,在一个封装线程的类里面,实际上控制函数是不是静态的无关紧要,关键的是该类在最终启动线程时,传递给CreateThread函数的控制函数必须符合上述的原型。至于VC的类为什么用静态的控制函数,我想只是为了方便,但这并不说明就不能用非静态函数实现。例如C++Builder中的线程类就没有用到静态控制函数。