一、程序,进程,线程
程序是指令的集合,以文件形式储存在磁盘上。一个程序可以对应多个进程,一个进程代表一个实例。
进程由管理进程的内核对象、地址空间组成。内核对象存放关于进程的统计信息,地址空间包含可执行模块、DLL模块和堆、栈。进程不执行任何东西,它是线程的容器,每个进程至少有一个线程。当创建一个进程时,操作系统自动创建一个线程—主线程。每个进程有4GB的地址空间,进程之间相互独立。
线程由线程的内核对象和线程栈组成。线程只有一个内核对象和栈,只有很少的内存。同一个进程的线程能共享进程的数据。
二、创建新线程
HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, //安全性结构 DWORD dwStackSize,//初始栈大小 LPTHREAD_START_ROUTINE lpStartAddress,//新线程函数入口地址 LPVOID lpParameter,//参数 DWORD dwCreationFlags,//CREATE_SUSPENDED或0 LPDWORD lpThreadID//线程ID );
注:用Sleep(……)可以使线程暂停自己的运行
三、创建互斥对象
互斥对象包括一个线程ID,一个计数器,一个使用数量。
可以创建匿名互斥对象、命名互斥对象。
HANDLE CreateMutex(……)
BOOL ReleaseMutex(HANDLE hMutex)
DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMillionseconds);
注:线程同步:可用匿名互斥对象
保证只有一个实例运行:命名互斥对象。(问题:进程之间相互独立,为什么可以用互斥对象?)
四、MFC中加载套接字库
BOOL AfxSocketInit(WSADATA *lpwsaData=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;
在程序的三处中加相应语句。