首页 > 代码库 > MFC第三节-多线程

MFC第三节-多线程

一、程序,进程,线程

程序是指令的集合,以文件形式储存在磁盘上。一个程序可以对应多个进程,一个进程代表一个实例。

进程由管理进程的内核对象、地址空间组成。内核对象存放关于进程的统计信息,地址空间包含可执行模块、DLL模块和堆、栈。进程不执行任何东西,它是线程的容器,每个进程至少有一个线程。当创建一个进程时,操作系统自动创建一个线程—主线程。每个进程有4GB的地址空间,进程之间相互独立。

线程由线程的内核对象和线程栈组成。线程只有一个内核对象和栈,只有很少的内存。同一个进程的线程能共享进程的数据。

二、创建新线程

HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, //安全性结构DWORD dwStackSize,//初始栈大小LPTHREAD_START_ROUTINE lpStartAddress,//新线程函数入口地址LPVOID lpParameter,//参数DWORD dwCreationFlags,//CREATE_SUSPENDED或0LPDWORD lpThreadID//线程ID);

注:用Sleep(……)可以使线程暂停自己的运行

三、创建互斥对象

互斥对象包括一个线程ID,一个计数器,一个使用数量。

可以创建匿名互斥对象、命名互斥对象。

HANDLE CreateMutex(……)

BOOL ReleaseMutex(HANDLE hMutex)

DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMillionseconds);

注:线程同步:可用匿名互斥对象

保证只有一个实例运行:命名互斥对象。(问题:进程之间相互独立,为什么可以用互斥对象?)

四、MFC中加载套接字库

BOOL AfxSocketInit(WSADATA *lpwsaData=http://www.mamicode.com/NULL)

对MFC程序,第一个要包含的头文件就是<stdafx.h>

五、在MFC中,线程函数不能是普通的成员函数。"如果要调用线程函数来启动某个线程的话,应该不需要产生某个对象就可以调用"。因此可以把它设置为类的静态成员函数。

如:

static DWORD WINAPI RecvProc(LPVOID lpParameter);

注意:在不能使用全局函数和全局变量时,可以采用静态成员函数和静态成员变量。它们不输入类的对象,而是类本身。

六、MFC的消息映射机制

一个MFC消息响应函数在程序中有三处相关信息:

1. 函数原型(h文件) afx_msg void OnLButtonDown(UINT nFlags, CPoint point);

2. 函数实现(c文件)void OnLButtonDown(UINT nFlags, CPoint point);

3. 用来关联消息和消息相应函数的宏 ON_WM_LBUTTONDOWN(XX,XX)

七、自定义消息

向消息队列加入消息:::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)tempBuf)

定义消息的值:#define WM_RECVDATA WM_USER+1;

在程序的三处中加相应语句。