怎么在静态线程函数里访问其他类的非静态成员函数?

vcokwap 2004-08-12 02:24:47
DWORD WINAPI Cfun::TalkThread(LPVOID p) //静态函数
{

CSBSession pTalkSession;
pTalkSession.Create(); //出错
}
class CSBSession
{
public:
void Create();
};
...全文
174 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
oyljerry 2004-08-12
  • 打赏
  • 举报
回复
用"memory_xj(青蛙) "的方法有时容易出错,所以用的时候一定要小心!

既然creat()有问题,就查看一下它
vcokwap 2004-08-12
  • 打赏
  • 举报
回复
调用f()没问题

我用其他函数调用确实没问题,确实是调用CAsyncSocket的Create()出问题

但程序启动时也调用了AfxSocketInit(),为什么不能Create呢

class CSBSession : public CAsyncSocket
{
void f()
////
}
vcokwap 2004-08-12
  • 打赏
  • 举报
回复
我用"memory_xj(青蛙) "的方法试过,调用begin()进入到TalkThread,Create出错
Cfun.h
class Cfun{
void begin();
CSBSession *pTalkSession;
}

CSBSession.h
class CSBSession
{
public:
void Create();
};


void Cfun::begin()
{

CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)TalkThread,(LPVOID)this,0,0);
}
DWORD WINAPI Cfun::TalkThread(LPVOID p) //静态函数
{
Cfun *dlg= (Cfun *)p;
dlg->pTalkSession =new CSBSession;
dlg->pTalkSession.Create();//出错

}

memory_xj 2004-08-12
  • 打赏
  • 举报
回复
在启动线程时:
AfxBeginThread(TalkThread, this, THREAD_PRIORITY_NORMAL);
这里的this指针也可以是其它类型的指针,就是LPVOID p,在TalkThread回调函数中,只需将这个指针相应转型,如CMyView *pView = (CMyView *)p;以下你可以用CMyView中的函数了。
holyeagle 2004-08-12
  • 打赏
  • 举报
回复
必须把该类的指针做为参数传入线程(全局变量不赞成),然后用这个指针访问。
vcokwap 2004-08-12
  • 打赏
  • 举报
回复
谢谢大家,没搞定,还是换种办法做
holyeagle 2004-08-12
  • 打赏
  • 举报
回复
另外,你的Cfun的生命周期是否正确,会不会在线程创建完就析构掉了
holyeagle 2004-08-12
  • 打赏
  • 举报
回复
如果create无反应,可以用getlasterror()查错;
如果create时crash,在stack call里面看看什么地方出错.

这种调用方式没有问题,只要使用的时候类型正确
Kudeet 2004-08-12
  • 打赏
  • 举报
回复
http://search.csdn.net/Expert/topic/2562/2562896.xml?temp=.3998529
flyelf 2004-08-12
  • 打赏
  • 举报
回复
GetLastError()看看是什么问题
DentistryDoctor 2004-08-12
  • 打赏
  • 举报
回复
上面说是是语法上的问题,无是Socket创建无法成功,则应该创建调用AfxSocketInit,AfxSocketInit针对每个创建Socket的线程都应该调用
howtotell 2004-08-12
  • 打赏
  • 举报
回复
没有对其他类的控件操作,一般这样都是不会出错的.
memory_xj(青蛙)的方法是可行的,不过最好在前面加一个static_cast
CMyView *pView = static_cast<CMyView *>(p);
DentistryDoctor 2004-08-12
  • 打赏
  • 举报
回复
你需要的是前置声明,根据怎么传递参数无关。
class CSBSession ;
DWORD WINAPI Cfun::TalkThread(LPVOID p) //静态函数
{

CSBSession pTalkSession;
pTalkSession.Create(); //出错
}
class CSBSession
{
public:
void Create();
};
nonocast 2004-08-12
  • 打赏
  • 举报
回复
把指针作为参数传进去

16,472

社区成员

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

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

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