类的成员函数能不能单独作为一个线程执行?

Vanyg 2002-05-07 06:20:05
有一个类ClassA,其中有一个成员函数FunA,在CView里面有一个ClassA的实例m_a。那么在CView里面能不能把m_a.FunA()作为线程执行?如果可以,那么这个线程能不能直接访问m_a的成员变量?
...全文
166 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
wx_zzm 2002-05-07
  • 打赏
  • 举报
回复
我从CWinThread派生线程类
class CMutiThread : public CWinThread
{
DECLARE_DYNCREATE(CMutiThread)
protected:
CMutiThread(); // protected constructor used by dynamic creation

// Attributes
public:

// Operations
public:
CWinPopupDlg *m_pOwner;
void SetOwner(CWinPopupDlg *Owner){m_pOwner=Owner;}

void SetExit(){m_iExit=EXIT;}

private:

int m_iExit;
public:

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMutiThread)
public:
virtual BOOL InitInstance();
virtual int ExitInstance();
virtual int Run();
//}}AFX_VIRTUAL

// Implementation
protected:
virtual ~CMutiThread();

// Generated message map functions
//{{AFX_MSG(CMutiThread)
// NOTE - the ClassWizard will add and remove member functions here.
//}}AFX_MSG

DECLARE_MESSAGE_MAP()
};


int CMutiThread::Run()
{
// TODO: Add your specialized code here and/or call the base class
GetNeiborhood();
//通知DLG网上邻居搜索完毕,可以添加到下拉框中了
m_pOwner->PostMessage(WM_NEIBORHOOD_FOUND,0,0);

while(!m_iExit)
{
GetNeiborhoodIP();
Sleep(10);
}

return 0;//CWinThread::Run();
}
y_may 2002-05-07
  • 打赏
  • 举报
回复
非法操作,有可能是因为没有释放资源
Vanyg 2002-05-07
  • 打赏
  • 举报
回复
可以了,就是按照 y_may(witch)和lvfengxun(lfx)说的方法。谢谢大家!
Vanyg 2002-05-07
  • 打赏
  • 举报
回复
刚才弄错了,我在CreateThread写参数时吧FunA写成FunA()了,所以以为可以作为线程打开。但实际上不行,写为FunA后编译都通不过。
Vanyg 2002-05-07
  • 打赏
  • 举报
回复
我试了一下,FunA可以作为线程执行,也可以访问m_a的成员变量。我跟追进FunA(),一直到它执行完,都没有错误,但退出一会就出现非法操作了。不知道是不是因为FunA()的参数没有按照线程函数的格式来设置的原因。
yu_hl 2002-05-07
  • 打赏
  • 举报
回复
是啊。
Vanyg 2002-05-07
  • 打赏
  • 举报
回复
用了CreateThread是不是还要调用其它的结束线程的函数?当线程函数退出后线程是不是就自己结束了?
Vanyg 2002-05-07
  • 打赏
  • 举报
回复
应该可以吧,要不纯的面向对象的程序怎么实现多线程啊。
y_may 2002-05-07
  • 打赏
  • 举报
回复
写错了,应该是a->FunA();
y_may 2002-05-07
  • 打赏
  • 举报
回复
直接作为线程函数可能不行
线程函数一定是这样的格式:
UINT ThreadFun(LPVOID pParam);
不过你这个应该可能这样写:
线程函数:
UINT ThreadFun(LPVOID pParam)
{
ClassA* a;a=(ClassA*)pParam;
a.FunA();
}//记得要包含ClassA的头文件,要不然会说ClassA没定义

开线程时这样调用:
AfxBeginThread(ThreadFun,&m_a);
而且,好像UINT ThreadFun(LPVOID pParam)不能是别人的成员函数。
因为我试过,好像不行它老说什么参数错误。后来我换成在外面单独的
头文件和cpp文件里定义就行了
调用时记得把该头文件包含进去
pcman1990 2002-05-07
  • 打赏
  • 举报
回复
静态的应该可以,但是不能访问m_a的成员变量。
不知你这样做的目的,如果想让一个线程访问ClassA的成员变量的话,可以把线程函数说明为ClassA的friend。
lvfengxun 2002-05-07
  • 打赏
  • 举报
回复
是不是可以这么用啊:
UINT FunAThread(LPVOID lpPara)
{
ClassA *pClass=(ClassA *)lpPara;
pClass->FunA();
//如果要访问ClassA的变量可以
pClass->m_...
return 0L;
}

void TestTunc()
{
AfxBeginThread(FunAThread,&m_a);

}

flywlsj 2002-05-07
  • 打赏
  • 举报
回复
可以,但是不能访问m_a的成员变量。
yz95 2002-05-07
  • 打赏
  • 举报
回复
多线程的函数好像只能是全局的
yu_hl 2002-05-07
  • 打赏
  • 举报
回复
作为线程函数吧?
静态的才可以。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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