八宝书库 > 文学其他电子书 > VC语言6.0程序设计从入门到精通 >

第55部分

VC语言6.0程序设计从入门到精通-第55部分

小说: VC语言6.0程序设计从入门到精通 字数: 每页4000字

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




等待。  

    Win32 提供了创建互斥器          CreateMutex() ,打开互斥器      OpenMutex() ,释放互斥器 

ReleaseMutex()等操作。  

    Mutex 的拥有权并非属于产生它的那个线程,而是属于最后对此  Mutex                        进行等待操作 

( 

 WaitForSingleObject )并且尚未进行 ReleaseMutex()操作的线程。线程拥有 Mutex  就好像进 

入临界区一样,一次只能有一个线程拥有该 Mutex 。如果一个拥有 Mutex 的线程在返回之前 

没有调用 ReleaseMutex() ,那么这个 Mutex 就被舍弃了。当其他线程等待这个 Mutex 时,仍 

能返回,并得到一个 WAIT_ABANDONED_0 返回值,一个 Mutex 被舍弃是 Mutex 特有的功 

能。下面详细介绍 Mutex 相关的函数。  



    (1)CreateMutex  

    函数 CreateMutex 用来创建或打开有名或无名的 Mutex 对象。如果调用成功,函数返回 

创建后对象的句柄 。如果同名 Mutex 对象在创建之前就已经存在,则函数返回现有的对象的 

句柄,并且 GetLastError  函数返回 ERROR_ALREADY_EXISTS 。否则返回创建的 Mutex 对 

象句柄。如果调用失败,返回空值。它的函数原型如下:  



    HANDLE CreateMutex(  



        LPSECURITY_ATTRIBUTES lpMutexAttributes;  



        BOOL bInitialOwner;    



        LPCTSTR lpName    



    );  



    函数中主要参数的意义如下。  

    o  lpMutexAttributes :指向 SECURITY_ATTRIBUTES 结构的指针,决定返回的句柄是否 

      可以被子进程继承。如果为空,则不能被继承。    



                                                                        ·239 ·  


…………………………………………………………Page 251……………………………………………………………

Visual C++ 6。0 程序设计从入门到精通  



     o  bInitialOwner : 指 定 Mutex   对 象 的 初 始 拥 有 者 。 如 果 调 用 者 创 建           Mutex  并 且 

       bInitialOwner 为 TRUE,调用线程获得 Mutex 对象的拥有权。否则,调用线程不拥有 

       Mutex 的所有权。    

     o  lpName :Mutex 对象的名称。字符串的最大长度为 MAX_PATH 个字符。字符串区分 

       大小写。如果         lpName  和一个现有的         Mutex   对象重名,函数需要对已有的对象有 

       MUTEX_ALL_ACCESS  的访问权。这种情况下,参数 bInitialOwner  被忽略,因为此 

       时它已经被已有的进程初始化。如果 lpMutexAttributes 非空,它决定句柄是否可以被 

       继承,但是它的安全描述成员被忽略。如果 lpName 为空,创建的 Mutex 对象没有名 

       称。    



     (2 )OpenMutex  

     函数 OpenMutex 用来打开一个存在的有名称的 Mutex 对象。如果调用成功,返回打开的 

对象的句柄。反之则返回空值。它的函数原型如下:  



     HANDLE OpenMutex(  



         DWORD dwDesiredAccess;      



         BOOL bInheritHandle;          



         LPCTSTR lpName                      



     );  



     函数主要参数的意义。  

     o  dwDesiredAccess :指定希望对 Mutex 对象进行的访问类型。可以是下面值的组合:  

        · MUTEX_ALL_ACCESS :可以对 Mutex 对象进行所有访问。  

        · SYNCHRONIZE:允许任何等待函数获得 Mutex 对象的所有权。  

     o  bInheritHandle :指定返回的句柄是否可以被继承。    

     o  lpName :要打开的 Mutex 对象的名称。  



     (3 )ReleaseMutex  

     函数 ReleaseMutex 释放指定的 Mutex 对象的所有权。如果调用线程没有 Mutex 对象的所 

有权,则说明调用失败。它的函数原型如下:  



     BOOL ReleaseMutex(  



         HANDLE hMutex        



     );  



     函数中主要参数的意义如下。  

     o  hMutex :Mutex 对象的句柄。  



     (4 )CMutex  

     Mutex 在 MFC  中相应的类是 CMutex 。CMutex 通过构造函数创建一个互斥器对象。当 

某个资源在一个时间只允许一个线程访问的时候,互斥器正好派上用场。  

     CMutex 只有一个构造函数 CMutex::CMutex,它的函数原型如下: 



     CMutex(    



      BOOL bInitiallyOwn = FALSE;    



      LPCTSTR lpszName = NULL;    



      LPSECURITY_ATTRIBUTES lpsaAttribute = NULL    



 ·240 ·  


…………………………………………………………Page 252……………………………………………………………

                                                                            第 9 章    多线程  



    );  



     函数中主要参数的意义如下。  

    o  bInitiallyOwn :指定创建线程是否在 CMutex 对象初始创建时访问互斥器控制的资源。  

    o  lpszName :CMutex   对象的名称。如果有同名的互斥器存在,如果为空,互斥器就没 

       有名称。如果和已有的互斥对象同名,构造函数创建一个以存在名称为参考的新的 

       CMutex 对象。如果名称和已有的其他同步对象同名,构造将失败。  

    o  lpsaAttribute :互斥对象的安全属性。  



     5 .信号量(Semaphore)  



     信号量是最具历史的同步机制 。信号量是解决 producer/consumer  问题的关键要素。对应 

的 MFC 类是 CSemaphore 。Win32 函数 CreateSemaphore()用来产生信号量。ReleaseSemaphore() 

用来解除锁定。Semaphore  的现值代表的意义是目前可用的资源数,如果 Semaphore  的现值 

为 1,表示还有一个锁定动作可以成功。如果现值为 5,就表示还有 5 个锁定动作可以成功。 

当调用 Wait 等函数要求锁定,如果 Semaphore 现值不为 0,Wait 马上返回,资源数减 1。当 

调用 ReleaseSemaphore()资源数加 1,当时不会超过初始设定的资源总数。  



     (1)CreateSemaphore  

     函数 CreateSemaphore 用来创建或者打开 Semaphore 对象。如果调用成功,函数返回创 

建后的对象句柄。如果同名 Semaphore 对象在创建之前就已经存在,则函数返回现有的对象 

的句柄,并且 GetLastError 函数返回 ERROR_ALREADY_EXISTS 。否则返回创建的 Semaphore 

对象句柄。如果调用失败,返回空值。它的函数原型如下:  



    HANDLE CreateSemaphore(  



        LPSECURITY_ATTRIBUTES lpSemaphoreAttributes;    



        LONG lInitialCount;                                                      



        LONG lMaximumCount;                                              



        LPCTSTR lpName                                                        



    );  



     函数中主要参数的意义如下。  

    o  lpSemaphoreAttributes :指定 SECURITY_ATTRIBUTES 结构的指针。决定返回的句柄 

       是否可以被子进程继承。如果 lpSemaphoreAttributes 为空,则句柄不能被继承。  

    o  lInitialCount :指定 Semaphore 对象的初始计数值 。该值必须大于或等于零并小于或等 

       于 lMaximumCount 。  

    o  lMaximumCount :指定 Semaphore 对象的最大数目。必须大于零。    

    o  lpName :Semaphore 对象的名称。字符串的最大长度为 MAX_PATH  个字符。字符串 

       区分大小写。  



     (2 )OpenSemaphore  

     函数 OpenSemaphore 用来打开一个存在的有名称的 Semaphore 对象。如果调用成功,返 

回打开的对象的句柄。反之则返回空值。它的函数原型如下:  



    HANDLE OpenSemaphore(  



        DWORD dwDesiredAccess;    



                                                                                   ·241 ·  


…………………………………………………………Page 253……………………………………………………………

Visual C++ 6。0 程序设计从入门到精通  



         BOOL bInheritHandle;      



         LPCTSTR lpName                



     );  



     函数中主要参数的意义如下。  

     o  dwDesiredAccess :指定想要对 Semaphore 对象所作的访问 。可以是下面值的任意组合:    

        · SEMAPHORE_ALL_ACCESS:可以对对象做任何访问。  

        · SEMAPHORE_MODIFY_STATE:允许在 ReleaseSemaphore 中修改对象的数目。  

        · SYNCHRONIZE:允许任何等待函数使用 Semaphore 对象。  

     o  bInheritHandle :指定返回的句柄是否可以被继承。  

     o  lpName :要打开对象的句柄。  



     (3 )ReleaseSemaphore  

     函数 ReleaseSemaphore 给指定的 Semaphore 对象增加指定的数量 。如果调用成功,返回 

非零值。反之,返回零。它的函数原型如下:  



     BOOL ReleaseSemaphore(  



         HANDLE hSemaphore;                



         LONG lReleaseCount;            



         LPLONG lpPreviousCount      



     );  



     函数中主要参数的意义如下:  

     o  hSemaphore :Semaphore 对象的句柄。  

     o  lReleaseCount :指定要增加的值。必须大于零。如果指定的值会引起 Semaphore 的数 

        目超过最大值,则函数返回FALSE 。  

     o  lpPreviousCount :存储 Semaphore 对象增加之前的数目。如果不需要,则该参数可以 

       为空。  



     (4 )CSemaphore  

     Semaphore 在 MFC 中的相应的类是 CSemaphore 。CSemaphore 通过构造函数创建一个信 

号量对象。CSemaphore 只有一个构造函数 CSemaphore:: CSemaphore,它的函数原型如下: 



     CSemaphore::CSemaphore(    



       LONG lInitialCount = 1;    



       LONG lMaxCount = 1;    



       LPCTSTR pstrName  = NULL;    



       LPSECURITY_ATTRIBUTES lpsaAttributes = NULL    



     );  



     函数中主要参数的意义如下。  

     o  lInitialCount :指定  Semaphore     对象初始的使用数目。必须大于等于零,小于等于 

       lMaxCount 。  

     o  lMaxCount :指定 Semaphore 对象最大的使用数目  

     o  pstrName :指定 Semaphore 对象的名称。  

     o  lpsaAttributes :指定 Semaphore 对象的安全属性。  



 ·242 ·  


…………………………………………………………Page 254……………………………………………………………

                                                                             第 9 章    多线程  



9。3。6    示例:串口通信  



     本节结合前面介绍的多线程计数,介绍 Windows 串口通信技术,通过建立多个线程,利 

用串口进行数据的发送 。通过使用 Mutex 控制串口的发送,使得同一时间只有一个线程利用 

串口发送数据。下面给出详细的过程。 

                                        



实例 9…3 :串口通信实例。源代码在光盘中“09实例 9…3Sm ”目录下。  



     1.创建工程  



     o  首先利用 VC++ 的 AppWizard 创建一个基于对话框的工程 Sm。所有设置都采用默 

       认选项。  

     o  为对话框加入串口控件。VC++ 的控件工具栏并没有包含串口控件,一次首先要将它 

       加入工具栏中。选择“Project ”…》  “Add To Project ”…》  “ponents and Controls ”, 

       如图 9…4 所示。  



                                                                



                                      图 9…4    添加控件  



     o  在文件打开对话框中选择“Microsoft  munications  Control;  version  6。0 ”,如图 9…5 

       所示,单击“Close ”按钮关闭对话框。  



     o  为 VC++插入控件后,控件工具栏上多出了一个图标                            ,如图 9…6 所示。  



                                                                              



                             图 9…5    插入 MSm 控件           图 9…6    插入控件后的控件工具栏  



                                                                                    ·243 ·  


…………………………………………………………Page 255……………………………………………………………

Visual C++ 6。0

返回目录 上一页 下一页 回到顶部 0 0

你可能喜欢的