Win32 API 是Windows操作系统为内核以及应用程序之间提供的接口,将内核提供的功能进行函数封装,应用程序通过调用相关的函数获得相应的系统功能。
MFC 是微软基础函数类库,由微软提供的,用类库的方式将Win32 API进行封装,以类的方式开发者。
HANDLE
句柄是一种指向指针的指针。指针是一种内存地址,应用程序启动后,组成这个程序的各对象是驻留在内存的。如果简单的理解,似乎我们只要知道这个内存的首地址,那就可以随时用这个地址访问对象。但是,这个是不正确的。
Windows是一个以虚拟内存为基础的操作系统,在这种操作系统环境下,Windows内存管理器经常在内存中来回移动,以此来满足各种应用程序的内存需要。对象被移动以为着它的地址变化了。如果地址总是如此变化,我们该到哪里去找该对象呢?!为了解决这个问题,Windows系统为各应用程序腾出了一些内存存储地址,用来专门登记各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。在应用程序中使用的变量如指针使用的是相对寻址方式,没有加段地址,使用的是相对于段地址的段偏移;在一些需要被操作系统调用、操作系统操作的变量,使用相对地址则会出现很多问题,因为段地址是无法确定的,因此系统就无法准确获取变量的地址,因此要使用句柄。
Windows中的句柄实际上是一个唯一的数字,它引用一个Windows对象,例如窗口或图表等。
Windows内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存,这样我们只需要记住这个句柄地址就可以间接的知道具体在内存中的哪个位置。这个地址是在对象装载(Load)时由系统分配的。当系统卸载时(UnLoad)又释放给系统。
句柄地址(稳定)->记载着对象在内存中的地址->对象在内存中的地址(不稳定)->实际对象。
创建线程函数:CreateThread和_beginthread(process.h)
线程的挂起与恢复:
进程中的每个线程都有挂起计数器(suspend count)。当挂起计数器值为0时,线程被执行;当挂起计数器值大于0时,调度器不去调度该线程。
DWORD SuspendThread(HANDLE);
DWORD ResumeThread(HANDLE)。
线程睡眠:
void WINAPI Sleep(DWORD dwMiliseconds);
线程终结:
void ExitThread(DWORD);
void _endthread();
void _endthreadex(unsigned retval);
BOOL WINAPI TerminateThread(HANDLE,DWORD)
获取线程返回值:
BOOL WINAPI GetExitCodeThread(HANDEL);
线程的退出:
释放操作系统资源,在线程结束前要清除线程及其所占资源。
线程退出调用函数:
CloseHandle
线程间的通信:
1,当有多个线程访问共享资源而不希望由于共享使资源遭到破坏时; 线程互斥
2,当一个线程需要将某个任务已经完成的情况通知另外一个或多个线程时; 线程同步
线程间通信的方法主要包括:
互锁函数 :函数执行以原子操作方式进行。
临界段
事件
互斥量
信号量
Window中的某些内核对象包含着一个特殊的属性,用来表示该内核对象是否处于已通知状态还是未通知状态。
主要内核对象有:
进程:文件修改通知
线程:事件
作业:可等待定时器
文件:信号量
控制台输入:互斥量
调度优先级