问个关于mfc多线程的问题

mutou0422 2009-05-12 12:12:53
我在界面上放个button,双击的处理函数是,新建一个线程然后用这个线程执行另外的函数。
大概就是
void CMainFrame::OnConnect()
{
AfxBeginThread(pfnThreadProc,pParam);
}
然则这个线程执行函数我在书上看到说只能调用全局函数或者类的静态成员函数,于是我还要定义了一个类A里面定义一个静态成员函数functhread,
由于这个函数要执行的功能还需要用到其他的一些类B里函数,我想的是我是不是要在我现在这个类A里再写这样
public:
static B m_B;
static void functhread();//类写在.h文件中,functhread具体实现的代码写在对应的.cpp文件中
以供给functhread调用呢。
假如这样可以,怎么把线程执行函数pfnThreadProc和functhread联系起来呢
我是菜鸟,刚接触这洗东西,头晕的很 希望大家能指点一下。谢谢了
...全文
365 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
mutou0422 2009-05-12
  • 打赏
  • 举报
回复
ls这样传递的话还要求dosomething的函数是静态成员函数么
hxfjb 2009-05-12
  • 打赏
  • 举报
回复
线程只能是静态函数,所以通常在一个类中写线程的处理函数的话比较讨厌,通常你可以这么做:
BOOL CClass1::Thread1(LPVOID lp)
{
CClass1 * cla1= (CClass1*)lp; //就是将该类的实例作为参数传递给该函数。
cla1->DoSomething();
}
qqiuzaihui 2009-05-12
  • 打赏
  • 举报
回复
调用类函数也是一样的:

DWORD WINAPI ThreadReadCard(LPVOID lpParameter)
{
B* myClass =//定义指针类
myClass->//调用类函数
delete(myClass);
........do sth.....
}
mutou0422 2009-05-12
  • 打赏
  • 举报
回复
还是不太明白ls的意思 我这个除了新建线程的时候是在窗口上点按钮的时候开始 其他和窗口没关系啊
还是你的意思是 我的程序调用的时候也可以像上面这样写?
mutou0422 2009-05-12
  • 打赏
  • 举报
回复
结完贴 又有个问题
在线程函数里可不可以放个SetTimer来让程序每隔多少秒执行一下
我看有的贴说 SetTimer依附于窗口,线程里用不了
到底是什么样的 大家再说一下吧
qqiuzaihui 2009-05-12
  • 打赏
  • 举报
回复
可采取在线程中主动获取调用窗体函数的方式:

DWORD WINAPI ThreadReadCard(LPVOID lpParameter)
{

CBollPlay* myDlg = (CBollPlay*)lpParameter; //CBollPlay窗体
myDlg->//函数 //调用函数
delete(myDlg);

........do sth.....
}
mutou0422 2009-05-12
  • 打赏
  • 举报
回复
ls两位可以说得再清楚一点么
就是我的functhread已经在类里面定义好了
怎么把它当作线程函数传递给AfxBeginThread呢
晒月光的青蛙 2009-05-12
  • 打赏
  • 举报
回复
静态函数只能调用静态函数和静态变量,你要把另外一个进程函数定义为静态的才能调用
yanjing_mail 2009-05-12
  • 打赏
  • 举报
回复
static void WINAPI functhread(LPVOID lpParameter);

HANDLE hThread = CreateThread(NULL,0,functhread,NULL,0,NULL);

or

void functhread(LPVOID lpParameter);

AfxBeginThread(&functhread,0);
DoctorWeir 2009-05-12
  • 打赏
  • 举报
回复
AfxBeginThread(ThreadFunc, NULL);

AfxBeginThread(&ThreadFunc, NULL);
mutou0422 2009-05-12
  • 打赏
  • 举报
回复
我写成这样了:AfxBeginThread(ThreadFunc, NULL);然后把定义的ThreadFunc的参数置为空

可是上面这句还是出错,麻烦指点一下
error C3867: “CMainFrame::ThreadFunc”: 函数调用缺少参数列表;请使用“&CMainFrame::ThreadFunc”创建指向成员的指针
ahao 2009-05-12
  • 打赏
  • 举报
回复
就是个LPVOID,随便传什么,没有就传NULL
mutou0422 2009-05-12
  • 打赏
  • 举报
回复
这里面的参数lp是什么意思啊。。。
我看msdn这么说的
pParam
Parameter to be passed to the controlling function as shown in the parameter to the function declaration in pfnThreadProc
可是我没有需要传给ThreadFunc()的参数,只是需要执行它就行了。。。

我试了 可是vs在创建线程这里报错
mutou0422 2009-05-12
  • 打赏
  • 举报
回复
MyClass * cla1= (MyClass*)lp; //就是将该类的实例作为参数传递给该函数。

其实这一步我不是很懂诶~~有哪位大侠和我说一下
直接定义一个Myclass的实例,在调用它的成员函数不行么?
biweilun 2009-05-12
  • 打赏
  • 举报
回复
可以
ahao 2009-05-12
  • 打赏
  • 举报
回复
没错,可以

mutou0422 2009-05-12
  • 打赏
  • 举报
回复
突然想问创建一个线程没什么特殊的要求把吧?
直接这样:
//先将MyClass包含进来
//然后
BOOL CClass1::Thread1(LPVOID lp)
{
MyClass * cla1= (MyClass*)lp; //就是将该类的实例作为参数传递给该函数。
cla1->DoSomething();
}

BOOL CClass1::ThreadFunc()
{
AfxBeginThread(Thread,lp);
}

这样可以么???

15,471

社区成员

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

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