类的成员如何做线程函数?

brainf 2003-08-23 07:38:35
类的成员如何做线程函数?

例如
UINT CTDlg::ThreadProc(LPVOID param)
{
m_strResult="Thread";
m_editResult.SetWindowText(m_strResult); //成员变量(CEdit控制 类型)
}

这个成员,想要这样用 :
AfxBeginThread(ThreadProc,NULL);
为什么无法成功? 错误为:
error C2665: 'AfxBeginThread' : none of the 2 overloads can convert parameter 1 from type 'unsigned int (void *)'

有人说 类的成员绝对不能做线程函数!是不是真的呀?

如果我想把带有很多成员变量的成员函数变为独立的函数改如何做啊?
例我想把上面那个函数变为 UINT ThreadProc(LPVOID param)
里面那些 成员变量 该如何使用啊?

在 CTApp::InitInstance() 有这句 CTDlg dlg;
我想在独立函数ThreadProc()中达到相同的功能是打 :dlg.m_editResult.SetWindowText(m_strResult) 吗?
我这样打了是错误的! 打了 dlg 后,后面的成员函数都不会自动列出!
到底该如何使用啊?
...全文
128 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
joinrry 2003-08-24
  • 打赏
  • 举报
回复
1、定义全局函数
2、静态类成员函数
vcforever 2003-08-24
  • 打赏
  • 举报
回复
把成员函数定义成static的就行了,其他的都一样!
呵呵……
yycec 2003-08-24
  • 打赏
  • 举报
回复
定义
class CMyClass
{
...
static DWORD Thread(LPVOID lpParameter)
...
}
启动
CWinThread *pThread = ::AfxBeginThread(CMyClass::Thread(¶meter));

试一试,还有一种,如果不怕麻烦的话,从CWinThread派生一个类出来。
Healer 2003-08-23
  • 打赏
  • 举报
回复
就是象楼上写的那样的, 很标准的写法, CAsyncSocket都是这样写的了:)
test7979 2003-08-23
  • 打赏
  • 举报
回复
FT,我在打什么 :)

UINT CTDlgThreadProc(LPVOID pParam )
{
CTDlg * dlg = (CTDlg *)pParam;
dlg->ThreadProc();
}
test7979 2003-08-23
  • 打赏
  • 举报
回复
就象这样:

UINT CTDlgThreadProc(LPVOID pParam )
{
CTDlg dlt = (CTDlg *)pParam;
pParam->ThreadProc();
}

不过你既然用了MFC,为什么不直接继承CWinThread呢?
晨星 2003-08-23
  • 打赏
  • 举报
回复
同意楼上,如果静态成员不能满足楼主的要求。把this指针传给线程函数,然后在线程函数内部通过this指针来间接调用非静态成员函数。

类的非静态成员函数之所以不能做线程函数,是因为线程函数需要被声明成WINAPI(即_stdcall)的,而类的非静态成员函数都是_thiscall的,不管编译器的内部实现如何,至少在逻辑上,后者比前者多一个隐式参数:this指针,因此这两种函数的指针不可以进行相互转换的。
test7979 2003-08-23
  • 打赏
  • 举报
回复
的确,线程函数必须是静态的,不过楼主可以这样做:

写一个线程函数,该函数接受的参数是你那个CTDlg

西江残月 2003-08-23
  • 打赏
  • 举报
回复
线程涵数必须是全局或着静态的!你可以把这个函数设为全局的,然后把param传对话框的指针!

15,472

社区成员

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

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