在多线程中如何调用MFC中类的一个函数?

csut_deng 2002-07-03 11:58:18
一个对话框MFC程序,类名为CMiddlePrgDlg,其有一个公用成员函数,定义如下:
public:
void OnTimerXf();
启动了一个线程:HWND hWnd=GetSafeHwnd();
AfxBeginThread(XfThreadProc,hWnd);
该线程函数中是这样实现的:
UINT XfThreadProc(LPVOID pParam)
{
HWND hWnd=(HWND) pParam;
CMiddlePrgDlg mm;
mm.OnTimerXf();
return 0;
}
想调用OnTimerXf函数,但用断点调试,一调就出错,请问各位高手,该如何调用呢?
...全文
274 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
cmouse 2002-07-03
  • 打赏
  • 举报
回复
同意楼上!
cmouse 2002-07-03
  • 打赏
  • 举报
回复
同意楼上!
FallenNaught 2002-07-03
  • 打赏
  • 举报
回复
CMiddlePrgDlg
{
public:
void OnTimerXf();
}
启动了一个线程:
AfxBeginThread(XfThreadProc, this);

线程函数:
UINT XfThreadProc(LPVOID pParam)
{
CMiddlePrgDlg * pDlg = (CMiddlePrgDlg *)pParam;
pDlg->OnTimerXf();
return 0;
}
Bind 2002-07-03
  • 打赏
  • 举报
回复
这个做法有问题,我曾经遇到过。具体原因我还没去查。改成这样就OK了。


UINT XfThreadProc(LPVOID pParam)
{
CMiddlePrgDlg* pDlg =
(CMiddlePrgDlg*)(::AfxGetApp()->m_pMainwnd);
pDlg->OnTimerXf();
.....
}

另:你是不是少写了一行?
UINT XfThreadProc(LPVOID pParam)
{
HWND hWnd=(HWND) pParam;
CMiddlePrgDlg* mm = CMiddlePrgDlg::FromHandle(hWnd);//***
mm.OnTimerXf();
return 0;
}
kingzai 2002-07-03
  • 打赏
  • 举报
回复
//XfThreadProc is static function,so you can't call common class funtion.you can use message or event information.such as...
UINT XfThreadProc(LPVOID pParam)
{
HWND hWnd=(HWND) pParam;
SendMessage(WM_USER,x,y);
...
return 0;
}
xiaodog 2002-07-03
  • 打赏
  • 举报
回复
我是这样传递参数的.不过函数没试过.你参考一下吧
CXXXDlg *pDlg=(CXXXDlg*)pParam;
yhb4 2002-07-03
  • 打赏
  • 举报
回复
用事件触发吧,这样调用不好
csut_deng 2002-07-03
  • 打赏
  • 举报
回复
成功了。。。但还有问题,上面是我的失误,应该为CString,谢谢各位。。。我总结一下我现在的问题,然后重新发贴问各位,多谢了,结贴了。。。
csut_deng 2002-07-03
  • 打赏
  • 举报
回复
我又做了一个测试,在成员函数Test中改为:
int m=10;
AfxMessageBOx(m);
结果前面的问题就来了,调用不成功了。。。请问为什么会这样呢?难道不能有自己的变量,可我有6个线程呀,如果用公共变量的话,会重复的。
csut_deng 2002-07-03
  • 打赏
  • 举报
回复
各位,我新建了一个成员函数Test,里面就一句话,弹出一个框来,竟然就成功了,怎么会这样,我这个OntimerXf是一个非常大的数据转换程序,为什么就不行呢。。。。
Yings 2002-07-03
  • 打赏
  • 举报
回复
我记得MFC的可视类不支持在子线程中用的。。。
horris 2002-07-03
  • 打赏
  • 举报
回复
在多线程中不能调另一个线程的MFC类对象,因为它们是与线程相关的,应该直接用HWND,象它放自定义消息(Post而非Send),并响应之.
csut_deng 2002-07-03
  • 打赏
  • 举报
回复
各位,非常不好意思,你们的方法我都采用了,但没有好的效果,都是一样,即一到调用OnTimerXf函数时就出跳出程序,出错,请问为什么会这样呢?还有什么解决方案吗?谢谢!

15,471

社区成员

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

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