如果一个类的线程函数设置成非静态,
用CreateThread创建线程的时候编译老是通过不了,为什么??
如果我不想设置成静态的可以么

解决方案 »

  1.   

    http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/vccore/html/_core_multithreading_with_c.2b2b_.and_mfc.asp
      

  2.   

    必须是静态的吧?
    如果是普通的类成员函数的话使用的不是stdcall
    怎么编译得通过嘛.
      

  3.   

    顺便说一下.
    如果用了CRT的话,创建线程最好用_beginthread
      

  4.   

    看它的线程函数规范来写
    通常就是COPY,只改名字这样的MS已做好规则(指函数的声明)的最好不要改动,
    另外可见到很多类似的函数:
    如LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
    或LPCTSTR AFXAPI AfxRegisterWndClass(
       UINT nClassStyle,
       HCURSOR hCursor = 0,
       HBRUSH hbrBackground = 0,
       HICON hIcon = 0 
    );
      

  5.   

    MFC里面启动线程最好用AfxBeginThread,它对MFC做了优化。
    线程函数声明为静态的,比较符合OOP的思想。
    一般是设计一个成员函数作为线程执行实体,一个启动线程的静态成员函数,
    在静态成员函数里面调用实体函数。这样很方便。
      

  6.   

    说到底是因为类的自身的原因,因为class 多自带了this 这个参数,而且默认是当作变量传给函数的,这样你在类内写线程函数的时候,传进去的参数是有问题的,具体的你可以看候杰的win32多线程编程这本书,非常详细
      

  7.   

    用CreateThread创建线程时,线程函数是必须存在的,也就是说,你必须能取到它的地址,这样线程才能知道到哪里去调用线程函数.全局函数和静态函数在编译时已经分配了地址,而类的非静态成员函数要等到实例化后才能取到地址.
      

  8.   

    谢谢大家的回答
    如果设置成静态的话,线程函数为整个类公用
    也就是说各个对象访问线程函数(或者说是创建线程)的话,
    访问的是不是同一个地址?需不需要同步?另外问一个题外话,怎么关闭csdn的声音——很烦人的,叮咚叮咚的!
      

  9.   

    如果有共享变量时,当然要同步保护。题外话:我还不知道CSDN有 叮咚叮咚,噪音扰民这回事, 木钱买耳机。
      

  10.   

    线程函数要么是类static类型,要么是全局csdn有那个声音,是因为你有短消息,注意看一下
      

  11.   

    线程入口函数肯定是静态或全局的.
    如果你写了个线程类,并希望能象CWnd::WindowProc重载的话?
    你就要为该类写一个全局线程入口函数. 传入参数为该类指针不就行了