类的成员如何做线程函数?
例如
UINT CTDlg::ThreadProc(LPVOID param)
{
m_strResult="Thread";
m_editResult.SetWindowText(m_strResult); //成员变量
}
这个成员,想要这样用 :
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 后,后面的成员函数都不会自动列出!
到底该如何使用啊?
线程涵数必须是全局或着静态的!你可以把这个函数设为全局的,然后把param传对话框的指针!
的确,线程函数必须是静态的,不过楼主可以这样做:
写一个线程函数,该函数接受的参数是你那个CTDlg
同意楼上,如果静态成员不能满足楼主的要求。把this指针传给线程函数,然后在线程函数内部通过this指针来间接调用非静态成员函数。
类的非静态成员函数之所以不能做线程函数,是因为线程函数需要被声明成WINAPI的,而类的非静态成员函数都是_thiscall的,不管编译器的内部实现如何,至少在逻辑上,后者比前者多一个隐式参数:this指针,因此这两种函数的指针不可以进行相互转换的。
FT,我在打什么 :)
UINT CTDlgThreadProc(LPVOID pParam )
{
CTDlg * dlg = (CTDlg *)pParam;
dlg->ThreadProc();
}
1、定义全局函数
2、静态类成员函数
定义
class CMyClass
{
...
static DWORD Thread(LPVOID lpParameter)
...
}
启动
CWinThread *pThread = ::AfxBeginThread(CMyClass::Thread(&Parameter));
试一试,还有一种,如果不怕麻烦的话,从CWinThread派生一个类出来。