/////////////////////////
//TheApp.h
class CMyApp:public CWinApp
{
.....
CEvent TheEvent;
static UINT ThreadFunction (LPVOID);
.....
}///////////////////////////
//TheApp.cpp
UINT CMyApp::ThreadFunction(LPVOID pParam)
{
  WaitForSingleObject(theEvent.m_hObject,INFINIT);
   theEvent. //*************
}编译出错,提示.m_hObject左边的应该是一个类或结构
注意打星星的行,我输入“.”以后,应该显示theEvent的成员,但是没有,如果我把ThreadFunction定义的static去掉,就有了,编译也能通过
我的意思是用一个类成员函数作为线程函数,因此这个函数必须说明为static,然而编译就通不过,另一种方法是将ThreadFunction说明为全局函数,但是我觉得这样有点不符合OO精神,难道前一种安排就没办法实现么?

解决方案 »

  1.   

    当然不行拉。静态成员函数只能使用静态数据成员。static UINT ThreadFunction (LPVOID);这个函数是静态的,但是CEvent TheEvent;不是静态的。所以肯定出错了。
      

  2.   

    static 成员函数不能调用非静态成员,在 static 的线程函数中 theEvent 是未定义的.
      

  3.   

    这样哦,我把theEvent说明成static就行了哦
      

  4.   

    这个错误该怎么办?
    --------------------Configuration: ty - Win32 Debug--------------------
    Compiling...
    ty.cpp
    Linking...
    ty.obj : error LNK2001: unresolved external symbol "public: static class CEvent CTyApp::ListenerStart" (?ListenerStart@CTyApp@@2VCEvent@@A)
    Debug/ty.exe : fatal error LNK1120: 1 unresolved externals
    Error executing link.exe.
    Creating browse info file...ty.exe - 2 error(s), 0 warning(s)
      

  5.   

    Link2001错误很多原因的。你把相关代码贴一下看看
      

  6.   

    static CEvent CTyApp::ListenerStart 这个函数说明了,而且有调用, 但是没有定义. 你看看,是不是漏写这个函数了?
      

  7.   

    class CTyApp : public CWinApp
    {
     public:
       CWinThread * pListener;
       static CEvent ListenerStart;
       static UINT Listener(LPVOID);
       virtual BOOL InitInstance();
     protected:
         afx_msg BOOL OnInitNet();
      ............
    }BOOL CTyApp::InitInstance()
    {
      ............
      ListenerStart.ResetEvent();
      ...................
    pListener=AfxBeginThread(Listener,NULL,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED,NULL);
    }
    BOOL CTyApp::OnInitNet()
    {  ........
        ListenerStart.SetEvent();
        ...............
    }UINT CTyApp::Listener(LPVOID pParam)
    {
    ..........
          WaitForSingleObject(ListenerStart.m_hObject,INFINITE);
          ................
    }
    代码很散,可能问题出在这些方,是不是要导入什么lib文件?
      

  8.   

    哦。知道了,静态数据成员除开在类定义中声明后,还要在使用之前在重新定义一次。你可以在.cpp文件的开始(在所有include后面)添加:
    CEvent CTyApp::ListenerStart;
      

  9.   

    呵呵,楼主啊。不是想怪你,最好再在C++上面用多点功夫,要不以后会很费力的哦。呵呵,这是善意的tips
      

  10.   

    哦。知道了,静态数据成员除开在类定义中声明后,还要在使用之前在重新定义一次。你可以在.cpp文件的开始(在所有include后面)添加:
    CEvent CTyApp::ListenerStart;啊??
      

  11.   

    静态成员函数中不能使用成员函数,可以通过向静态成员函数传递对象的 this 指针,通过该指针来访问之个成员函数
      

  12.   

    在类中知识声明而已。你要在使用ListenerStart之前,再定义一次。
    CEvent CTyApp::ListenerStart;
      

  13.   

    将ThreadFunction说明为全局函数,然后将类的this指针作为参数传进去,用以控制类.这应该是比较简单易行的方法了
      

  14.   

    呵呵,C++么,具体细节是差了点,但是我觉得C++的精髓应该在面向对象,以及与此相关的继承和派生、虚拟和多态,用C++写程序关键是要在设计的时候贯彻OO的思想,最大程度的重用代码,最近在啃MFC,说实话,我觉得我的问题不在语言或思想上,而在工具或环境上,MFC并不是多么玄奥,但是它叠床架屋,不胜其繁,MFC将很多技术内幕隐藏起来,提供给开发者一个傻瓜似的界面,可是我很纳闷,只会用那些Wizard的话能开发出有商业意义的程序吗,倘若所隐藏的东西对于想要开发有实际意义的应用的程序员来说是必须知道的,那这种隐藏就不是福音,而是恶梦。发点牢骚,也知道多数人可能不赞同我的想法,不知道有没有人和我同感。
    之所以要坚持将线程函数声明为CWinApp类的成员函数,是因为我觉得CTyApp代表一个应用程序对象,从OO的观点来看,应用程序中的线程理应是应用程序类的一部分,即一个成员。
    空气的方法应该可行
    多谢仙逸先生的Tip,而且你的方法是对的,可是为什么?还请指教!