在标题所示的页码里例15-12中:
HANDLE hThread=CreateThread(NULL,0,RecvProc,......);
中的RecvProc如果定义为ChatDlg的成员函数,如例15-13,在编译是怎么会出错呢?
我不能理解,我的理解是:HANDLE hThread=CreateThread(NULL,0,RecvProc,......);是在ChatDlg类的成员函数OninitDialog
成员函数里调用的啊,应该可以调用本类的成员函数RecvProc的啊,请高手指点下。
小弟献上30分

解决方案 »

  1.   

    是的   可以定义为静态(static)的成员函数  或者是 全局函数   枚举窗口的还是也是这样的  
      

  2.   

    两位帅哥看清我问题再回答啊,你们讲的都是书上的,那个我也知道啊,我要知道的是为什么:HANDLE hThread=CreateThread(NULL,0,RecvProc,......);是在ChatDlg类的成员函数OninitDialog
    成员函数里调用的啊,应该可以调用本类的成员函数RecvProc(也是CChatDlg的成员函数)的啊
      

  3.   

    线程工作函数必须是全局的或者静态的(static)
    目的只有一个,就是需要在编译期能分配上内存,以确保在创建线程时成功回调其线程函数!(
      

  4.   

    MFC里请不要使用CreateThread,请使用AfxBeginThread和CWinThread,否则可能出现一些全局变量和MFC内部数据被破坏的情况。
      

  5.   

    类的成员函数一般不要作为CreateThread的工作函数。因为类的动态成员的内存结构会在运行时进行构造,而且会有隐含的this指针传入(编译器添加),建议使用static的成员函数。或者是全局的函数。因为他们不会有this指针,符合Windows对回调函数的要求。
      

  6.   

    呵呵,这个问题我说说吧:
     首先楼主要清楚几点
    1  在c++中类的非静态成员函数都有一个隐含的this指针,正是因为这个this指针使得普通的非静态成员函数无法作为一个callback(回调)函数来使用。至于为什么无法作为一个回调函数,请看第二点。
    2  好了,问题就是出在这个隐含的this指针上,callback函数是给windows回调使用的,windows在用的到这个回调函数的时候会不借助任何对象调用这个函数,也就没有为这个函数传递this指针,你如果非要给这个createthread函数传递一个非静态成员函数,那么这个函数肯定会有一个隐含的this指针。但是在函数调用的时候,由于这种系统规定的callback函数调用机制使得它不可能为这个函数准备一个参数,这样函数调用堆栈中的参数个数少了一个,结果当然会使程序崩溃了!
    3  所以啊,楼主不弄混了,在类的成员函数里当然可以调用类的另一个成员函数,只是让它作为一个回调函数是有大问题的,除非将它声明为静态的成员函数,这样编译器就会将这个this指针去掉,也就适合作为一个回调函数了。
     
     不知道楼主看懂了没有,有问题 加我Q895262587
      

  7.   

    RecvProc函数定义为static成员函数就行了
      

  8.   

    回调必须是 静态函数,反正你加个 static 就OK了
      

  9.   

    看下Inside C++ Object Modal就明白了。
      

  10.   

    因为成员函数所带的参数中多了一个隐含的this指针,造成函数原型不符   
    而类中的静态函数是属于某一个类,而不是某一个对象,里面没有隐含的this指针
      

  11.   

    ]
    按照9楼的说法,那回调函数的默认参数堆栈里就没有接收this指针的那一块了,我想知道
    HANDLE hThread=CreateThread(NULL,0,RecvProc,......)里的RecvProc规定好了是回调函数吗?
    我查了MSDN,好象里面也没怎么说啊
      

  12.   

    关键的问题是,回调(Callback)函数的调用约定必须是 __stdcall,但类的成员函数的调用约定是 thiscall