第二十章 多任务和多线程

来源:互联网 发布:猜数游戏编程 编辑:程序博客网 时间:2024/06/05 14:19

Microsoft Windows的16位版本支持有限度的多任务,Windows的32位版本支持真正的多任务,而且,还多了一种额外的优点,多线程

20.1多任务的各种模式

多线程是为了使得多个线程并行的工作以完成多项任务,以提高系统的效率。线程是在同一时间需要完成多项任务的时候被实现的 多任务是指用户可以在同一时间内运行多个应用程序,每个应用程序被称作一个任务。Windows就是一个支持多任务的操作系统,比起DOS的单任务系统,确实方便了许多。使用Windows定时器是在Windows的早期(和目前)版本中模拟多任务的一种好方法,然而,定时器的使用有时限制了程序的速度。

20.2Windows 的多线程处理

建立新的线程的API函数是CreateThread.线程回调函数格式:DWORD WINAPI ThreadProc(PVOID pParam);

再论随机矩形

「Project Settings」  「C/C++」  「Category」  「Code Generation」
在「Use  Run-Time  Library」下拉式清单方块中,可以看到用于「Release」设定的
「Single-Threaded」和用于Debug设定的「Debug  Single-Threaded」 。将这些分别改
为「Multithreaded」和「Debug Multithreaded」 。这将把编译器旗标改为/MT

PROCESS.H,这个文件定义一个名为_beginthread的函数,它启动一个新的线程。只有定义了_MT标识符,才会声明这个函数,这是/MT旗标的另一个结果。

  

编译器将在.OBJ文件中插入LIBCMT.LIB文件名,而不是LIBC.LIB。连结程序使用这个名称与执行期链接库函数连结LIBC.LIB和LIBCMT.LIB文件包含C语言链接库函数,有些C语言链接库函数包含静态数据。  

多线程解决方案

 

临界区域通过对EnterCriticalSection和LeaveCriticalSection的呼叫而加以界定。最好不要在线程之间共享GDI对象。

Sleep的好处

线程呼叫Sleep函数来自动暂停执行,该函数唯一一个参数是以毫秒计的时间。Sleep函数呼叫在指定的时间过去以前不会传回控制权。在这段时间内,线程被暂停,并且不会被配置给时间片段

20.3线程同步

有四个函数用于临界区域。要使用这些函数,您必须定义一个临界区域对象,这是一个型态
为CRITICAL_SECTION的整体变量。
CRITICAL_SECTION cs ;
这个临界区域对象必须先被程序中的某个线程初始化
InitializeCriticalSection (&cs) ;
当临界区域对象被初始化之后,线程可以通过下面的呼叫进入临界区域:
EnterCriticalSection (&cs) ;  
离开临界区域时,函数才会传回控制权:
LeaveCriticalSection (&cs) ;  
当临界区域不再被程序所需要时,可以通过呼叫
DeleteCriticalSection (&cs) ;  
临界区域的一个限制是它们只能用于在同一程序内的线程之间的协调。
需要协调两个不同程序对同一资源的共享(如共享内存等)。在此其况下不能使用临界区
域,但是可以使用一种被称为「互斥对象(mutex  object) 」的技术

事件对象

事件对象可以是「有信号的」或「没信号的」
可以通过下面呼叫来建立事件对象:
hEvent = CreateEvent(&sa, fManual, fInitial, pszName);  
第一个参数(指向一个SECURITY_ATTRIBUTES结构的指针)和最后一个参数(一个事
件对象的名字)只有在事件对象被多个程序共享时才有意义。
要设立一个现存的事件对象,呼叫
SetEvent(hEvent); 
要重置一个事件对象,呼叫
ResetEvent(hEvent);

BIGJOB1

BIGJOB2