MFC中创建线程的问题

[复制链接]
查看11 | 回复4 | 2009-7-1 11:41:05 | 显示全部楼层 |阅读模式
线程的处理函数应该是这样的:LRESULT YourThreadName( LPVOID lpVoid );另外,该函数应该是静态的,或者是全局的(不属于某类)。 如果实在要调用类的成员函数作为线程处理。那么最好的方法就是使用Thunk技术。MFC的消息处理,就是用到了Thunk技术。Thunk技术是什么呢?我们知道,窗口的处理过程函数,根线程处理函数类似,也必须是静态的,或者是全局的,但是MFC类中的每个窗口类,都可以有类似CWnd::OnLButtonDown这样的虚函数可以重载,就是说,他的消息处理放到了类的内部成员函数中了!!它是怎么实现的?就是Thunk~~~要想知道Thunk的具体技术细节,可以去访问我的百度空间。
回复

使用道具 举报

千问 | 2009-7-1 11:41:05 | 显示全部楼层
第一个问题的答案是staticvoid CtestDlg::a(LPVOID cs1){}第二个问题的答案是static void CADlg::OnButton1() { // TODO: Add your control notification handler code here AfxMessageBox("1111111111");}全部设置为静态就OK了!
回复

使用道具 举报

千问 | 2009-7-1 11:41:05 | 显示全部楼层
void CtestDlg::a(LPVOID lpParam){}void CtestDlg::b(){ HANDLE _h = (HANDLE)_beginthreadex(NULL, 0, a, (LPVOID)this, 0, &m_dwThreadID); //自己定义UINT m_dwThreadID} 可能要加头文件#include在头文件中要用静态函数声明static void a(LPVOID lpParam);
回复

使用道具 举报

千问 | 2009-7-1 11:41:05 | 显示全部楼层
首先线程运行函数必须是全局的,如果写到类里必须是静态的,调用方法很简单,例如:((CMyApp*)AfxGetApp())->commthread = AfxBeginThread(CommuCanShuUpFunc,(LPVOID)NULL);如果想调用类里函数,而且不写成静态的可以定义一个全局类对象,在线程中通过这个全局类对象调用你需要的函数
回复

使用道具 举报

千问 | 2009-7-1 11:41:05 | 显示全部楼层
你的a函数如果一定要写在类里面的话它必须是静态函数;另外尽量用_beginthreadex来创建线程
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行