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);..............这里怎么写呢?
} 展开
例:
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);..............这里怎么写呢?
} 展开
6个回答
展开全部
用静态也够呛。容易出错
用个中转的法子吧
前面定义一个现场函数
DWORD WINAPI ThreadProc( LPVOID lpParam )
{
CtestDlg*pDlg = (CtestDlg*)lpParam;
ASSERT(pDlg);
pDlg->a(....);// 或者其他的什么函数都可以
return 1;
}
创建线程的地方。
CreateThread(
NULL,
0,
ThreadProc,
(void*)this,
0,
NULL);
要传递什么参数的话,可以在CtestDlg 里面定义个成员变量,来赋值传递参数。
问题二,也可以这样解决。
用个中转的法子吧
前面定义一个现场函数
DWORD WINAPI ThreadProc( LPVOID lpParam )
{
CtestDlg*pDlg = (CtestDlg*)lpParam;
ASSERT(pDlg);
pDlg->a(....);// 或者其他的什么函数都可以
return 1;
}
创建线程的地方。
CreateThread(
NULL,
0,
ThreadProc,
(void*)this,
0,
NULL);
要传递什么参数的话,可以在CtestDlg 里面定义个成员变量,来赋值传递参数。
问题二,也可以这样解决。
展开全部
线程的处理函数应该是这样的:
LRESULT YourThreadName( LPVOID lpVoid );
另外,该函数应该是静态的,或者是全局的(不属于某类)。
如果实在要调用类的成员函数作为线程处理。那么最好的方法就是使用Thunk技术。
MFC的消息处理,就是用到了Thunk技术。
Thunk技术是什么呢?
我们知道,窗口的处理过程函数,根线程处理函数类似,也必须是静态的,或者是全局的,但是MFC类中的每个窗口类,都可以有类似CWnd::OnLButtonDown这样的虚函数可以重载,就是说,他的消息处理放到了类的内部成员函数中了!!它是怎么实现的?就是Thunk~~~
要想知道Thunk的具体技术细节,可以去访问我的百度空间。
LRESULT YourThreadName( LPVOID lpVoid );
另外,该函数应该是静态的,或者是全局的(不属于某类)。
如果实在要调用类的成员函数作为线程处理。那么最好的方法就是使用Thunk技术。
MFC的消息处理,就是用到了Thunk技术。
Thunk技术是什么呢?
我们知道,窗口的处理过程函数,根线程处理函数类似,也必须是静态的,或者是全局的,但是MFC类中的每个窗口类,都可以有类似CWnd::OnLButtonDown这样的虚函数可以重载,就是说,他的消息处理放到了类的内部成员函数中了!!它是怎么实现的?就是Thunk~~~
要想知道Thunk的具体技术细节,可以去访问我的百度空间。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
第一个问题的答案是static void CtestDlg::a(LPVOID cs1)
{
}
第二个问题的答案是static void CADlg::OnButton1()
{
// TODO: Add your control notification handler code here
AfxMessageBox("1111111111");
}
全部设置为静态就OK了!
{
}
第二个问题的答案是static void CADlg::OnButton1()
{
// TODO: Add your control notification handler code here
AfxMessageBox("1111111111");
}
全部设置为静态就OK了!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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);
{
}
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);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先线程运行函数必须是全局的,如果写到类里必须是静态的,调用方法很简单,例如:
((CMyApp*)AfxGetApp())->commthread = AfxBeginThread(CommuCanShuUpFunc,(LPVOID)NULL);
如果想调用类里函数,而且不写成静态的可以定义一个全局类对象,在线程中通过这个全局类对象调用你需要的函数
((CMyApp*)AfxGetApp())->commthread = AfxBeginThread(CommuCanShuUpFunc,(LPVOID)NULL);
如果想调用类里函数,而且不写成静态的可以定义一个全局类对象,在线程中通过这个全局类对象调用你需要的函数
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2009-06-28
展开全部
你的a函数如果一定要写在类里面的话它必须是静态函数;另外尽量用_beginthreadex来创建线程
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询