Windows中没有多进程的概念,只有多线程。
在MFC中一般使用AfxBeginThread来启动工作者线程,用新建类,然后new这个类后调用CreateThread方法来启动界面线程。
工作者线程和界面线程的区别是:界面线程比工作者线程多一个可接收windows消息的功能,也就是说,我们可以给界面线程发送自定义消息,让界面线程响应。
来一份工作者线程的代码样例:
// 定义工作者线程函数
UINT ThreadScanSockets(LPVOID pParam)
{
int i = 0;
while (1) {
TRACE("ThreadScanSockets %d\n", ++i);
}
}
// 调用方法:
AfxBeginThread(ThreadScanSockets, NULL);
界面线程的创建相对复杂,步骤如下:
1、点菜单的查看–建立类向导,Add Class… – New…。
2、填写类名称,如CMyThread,Base Class选择CWinThread,点OK按钮(我这里提示无法打开MyThread.h,其实已经创建成功了,关闭窗口就行了,这个是VC的bug):
3、注意首先把头文件里的构造函数、析构函数改为public类型。定义一个自定义的用户消息,因为这个类主要是要响应一些消息做一些事情(WM_USER+N), N >= 0:
#define WM_MSG_FIREUIMSG (WM_USER+11) // 用户自定义消息
4、注册消息函数,如下所示(注意你只需要添加ON_THREAD_MESSAGE到这个位置即可,其它代码VC已经自动生成了):
BEGIN_MESSAGE_MAP(CMyThreadMsg, CWinThread)
//{{AFX_MSG_MAP(CFireUIThreadMsg)
ON_THREAD_MESSAGE(WM_MSG_FIREUIMSG, CMyThreadMsg::FireUIWork)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
5、剩下的懂C++编程的同学就都懂了,在.h文件里增加:
afx_msg void FireUIWork(WPARAM wpParam, LPARAM lpParam); // 消息处理函数
然后实现它!
void CMyThreadMsg::FireUIWork(WPARAM wpParam, LPARAM lpParam)
{
TRACE("FireUIWork: wpParam=%d lpParam=%d\n", wpParam, lpParam);
}
6、创建线程并运行:
// 定义全局变量
CFireUIThreadMsg *g_pThread = NULL;
// 其它代码.......
g_pThread = new CFireUIThreadMsg();
g_pThread ->CreateThread();
7、给该线程发送消息:
界面某个位置创建一个按钮,在按钮响应函数里增加下面的代码:
g_pThread->PostThreadMessage(WM_MSG_FIREUIMSG, 100, 200);
调试程序看看效果吧。