奇观的问题,在线等,高手请进来一观

Tranquillo 2005-05-09 08:45:57
/////////////////////////
//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精神,难道前一种安排就没办法实现么?
...全文
165 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tranquillo 2005-05-10
  • 打赏
  • 举报
回复
呵呵,C++么,具体细节是差了点,但是我觉得C++的精髓应该在面向对象,以及与此相关的继承和派生、虚拟和多态,用C++写程序关键是要在设计的时候贯彻OO的思想,最大程度的重用代码,最近在啃MFC,说实话,我觉得我的问题不在语言或思想上,而在工具或环境上,MFC并不是多么玄奥,但是它叠床架屋,不胜其繁,MFC将很多技术内幕隐藏起来,提供给开发者一个傻瓜似的界面,可是我很纳闷,只会用那些Wizard的话能开发出有商业意义的程序吗,倘若所隐藏的东西对于想要开发有实际意义的应用的程序员来说是必须知道的,那这种隐藏就不是福音,而是恶梦。发点牢骚,也知道多数人可能不赞同我的想法,不知道有没有人和我同感。
之所以要坚持将线程函数声明为CWinApp类的成员函数,是因为我觉得CTyApp代表一个应用程序对象,从OO的观点来看,应用程序中的线程理应是应用程序类的一部分,即一个成员。
空气的方法应该可行
多谢仙逸先生的Tip,而且你的方法是对的,可是为什么?还请指教!
yuanchao111 2005-05-09
  • 打赏
  • 举报
回复
将ThreadFunction说明为全局函数,然后将类的this指针作为参数传进去,用以控制类.这应该是比较简单易行的方法了
horisly 2005-05-09
  • 打赏
  • 举报
回复
在类中知识声明而已。你要在使用ListenerStart之前,再定义一次。
CEvent CTyApp::ListenerStart;
qrlvls 2005-05-09
  • 打赏
  • 举报
回复
静态成员函数中不能使用成员函数,可以通过向静态成员函数传递对象的 this 指针,通过该指针来访问之个成员函数
KevinWon 2005-05-09
  • 打赏
  • 举报
回复
哦。知道了,静态数据成员除开在类定义中声明后,还要在使用之前在重新定义一次。

你可以在.cpp文件的开始(在所有include后面)添加:
CEvent CTyApp::ListenerStart;

啊??
niat2005 2005-05-09
  • 打赏
  • 举报
回复
静态成员函数只能使用静态数据成员
horisly 2005-05-09
  • 打赏
  • 举报
回复
呵呵,楼主啊。不是想怪你,最好再在C++上面用多点功夫,要不以后会很费力的哦。呵呵,这是善意的tips
horisly 2005-05-09
  • 打赏
  • 举报
回复
哦。知道了,静态数据成员除开在类定义中声明后,还要在使用之前在重新定义一次。

你可以在.cpp文件的开始(在所有include后面)添加:
CEvent CTyApp::ListenerStart;
Tranquillo 2005-05-09
  • 打赏
  • 举报
回复
ListenerStart是个变量
Tranquillo 2005-05-09
  • 打赏
  • 举报
回复
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文件?
jackiehzh 2005-05-09
  • 打赏
  • 举报
回复
查MSDN看看相关提示!
Goldbach 2005-05-09
  • 打赏
  • 举报
回复
静态成员函数只能使用静态数据成员
jerry 2005-05-09
  • 打赏
  • 举报
回复
static CEvent CTyApp::ListenerStart 这个函数说明了,而且有调用, 但是没有定义.

你看看,是不是漏写这个函数了?
horisly 2005-05-09
  • 打赏
  • 举报
回复
Link2001错误很多原因的。你把相关代码贴一下看看
Tranquillo 2005-05-09
  • 打赏
  • 举报
回复
这个错误该怎么办?
--------------------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)
Tranquillo 2005-05-09
  • 打赏
  • 举报
回复
这样哦,我把theEvent说明成static就行了哦
adie20018u8 2005-05-09
  • 打赏
  • 举报
回复
static 成员函数不能调用非静态成员,在 static 的线程函数中 theEvent 是未定义的.
horisly 2005-05-09
  • 打赏
  • 举报
回复
当然不行拉。静态成员函数只能使用静态数据成员。

static UINT ThreadFunction (LPVOID);这个函数是静态的,但是CEvent TheEvent;不是静态的。所以肯定出错了。

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧