MFC中创建线程的问题

在MFC中如何用线程调用子程序?例:voidCtestDlg::a(LPVOIDcs1){}voidCtestDlg::b(){在这里用线程启动aHANDLE_h=Cre... 在MFC中如何用线程调用子程序?
例:

void CtestDlg::a(LPVOID cs1)
{
}

void CtestDlg::b()
{
在这里用线程启动a

HANDLE _h = CreateThread(...,a....) 这里怎么写才能编译通过且运行不出错?
}
例2: 如果是按钮事件呢?

void CADlg::OnButton1()
{
// TODO: Add your control notification handler code here
AfxMessageBox("1111111111");
}

void CADlg::OnButton2()
{
// TODO: Add your control notification handler code here
//这里调用OnButton1事件 OnButton1是按钮

CreateThread(NULL,NULL,OnButton1,NULL,NULL,NULL);..............这里怎么写呢?
}
展开
 我来答
stone_dongdong
2009-07-01 · TA获得超过2853个赞
知道大有可为答主
回答量:1636
采纳率:0%
帮助的人:1005万
展开全部
用静态也够呛。容易出错

用个中转的法子吧
前面定义一个现场函数
DWORD WINAPI ThreadProc( LPVOID lpParam )
{
CtestDlg*pDlg = (CtestDlg*)lpParam;
ASSERT(pDlg);
pDlg->a(....);// 或者其他的什么函数都可以

return 1;
}

创建线程的地方。

CreateThread(
NULL,
0,
ThreadProc,
(void*)this,
0,
NULL);
要传递什么参数的话,可以在CtestDlg 里面定义个成员变量,来赋值传递参数。

问题二,也可以这样解决。
百度网友1d8e8b9
2009-07-02 · TA获得超过913个赞
知道小有建树答主
回答量:589
采纳率:60%
帮助的人:317万
展开全部
线程的处理函数应该是这样的:

LRESULT YourThreadName( LPVOID lpVoid );

另外,该函数应该是静态的,或者是全局的(不属于某类)。

如果实在要调用类的成员函数作为线程处理。那么最好的方法就是使用Thunk技术。

MFC的消息处理,就是用到了Thunk技术。
Thunk技术是什么呢?
我们知道,窗口的处理过程函数,根线程处理函数类似,也必须是静态的,或者是全局的,但是MFC类中的每个窗口类,都可以有类似CWnd::OnLButtonDown这样的虚函数可以重载,就是说,他的消息处理放到了类的内部成员函数中了!!它是怎么实现的?就是Thunk~~~

要想知道Thunk的具体技术细节,可以去访问我的百度空间。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
涂镶之37
2009-06-29 · TA获得超过405个赞
知道小有建树答主
回答量:783
采纳率:0%
帮助的人:352万
展开全部
第一个问题的答案是static void CtestDlg::a(LPVOID cs1)
{
}

第二个问题的答案是static void CADlg::OnButton1()
{
// TODO: Add your control notification handler code here
AfxMessageBox("1111111111");
}

全部设置为静态就OK了!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
镁客网
2009-06-28 · TA获得超过124个赞
知道答主
回答量:42
采纳率:0%
帮助的人:31.9万
展开全部
void CtestDlg::a(LPVOID lpParam)
{
}

void CtestDlg::b()
{
HANDLE _h = (HANDLE)_beginthreadex(NULL, 0, a, (LPVOID)this, 0, &m_dwThreadID); //自己定义UINT m_dwThreadID
}

可能要加头文件#include <process.h>

在头文件中要用静态函数声明static void a(LPVOID lpParam);
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友87b4f1c69
2009-06-29 · TA获得超过1218个赞
知道小有建树答主
回答量:760
采纳率:0%
帮助的人:969万
展开全部
首先线程运行函数必须是全局的,如果写到类里必须是静态的,调用方法很简单,例如:
((CMyApp*)AfxGetApp())->commthread = AfxBeginThread(CommuCanShuUpFunc,(LPVOID)NULL);

如果想调用类里函数,而且不写成静态的可以定义一个全局类对象,在线程中通过这个全局类对象调用你需要的函数
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2009-06-28
展开全部
你的a函数如果一定要写在类里面的话它必须是静态函数;另外尽量用_beginthreadex来创建线程
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式