友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
一世书城 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

VC语言6.0程序设计从入门到精通-第69章

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




    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 程序设计从入门到精通  



                                                 



     o  为对话框添加控件,界面设计如图 9…7 所示,控件的属性如表 9…7 所示。  

     o  为程序添加选择串口对话框资源,添加一个                          boBox     串口让用户选择使用,创建 

       CmSettingDlg 类。  



                                                                  



                                    图 9…7    对话框界面设计  



     表 9…7                              对话框控件列表  



                ID                          属性或作用                          控件类型  

 IDC_STATIC                         接收数据                         组合框  

 IDC_STATIC                         发送数据                         组合框  

 IDC_SENDDATA                       发送的数据                        编辑框控件  

 IDC_IDC_RECEIVEDATA                接收的数据                        编辑框控件  

 IDC_SEND                           发送                           按钮控件  

 IDC_OPEN                        打开串口                         按钮控件  

 IDC_CLOSE                          关闭串口                         按钮控件  

 IDCANCEL                           退出                           按钮控件  

 IDC_MSM1                        实现串口的封装                       串口控件  



     2 .编写代码  



     (1)定义变量  

     添加同步对象 Mutex 的句柄和名称的全局变量,代码如下:  



     //   同步 Mutex 对象  



     HANDLE  g_hMutex;  



     CString g_strName = _T(〃Serial_m_Mutex_name〃);  



     定义发送数据的格式,代码如下:  



     typedef struct _data  



     {  



         HWND           hWnd;  



 ·244 ·  


…………………………………………………………Page 256……………………………………………………………

                                                                                                                     第 9 章    多线程  



       CMSm *              pm;  



       char           
返回目录 上一页 下一页 回到顶部 0 1
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!