友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
VC语言6.0程序设计从入门到精通-第50部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
o hObject :对象的句柄。
(4 )CEvent
事件(Event )在 MFC 中的相应的类是 CEvent 。CEvent 的构造函数默认创建一个自动重
置的事件,而且处于未激发状态。它的成员函数及其作用如表 9…6 所示。
表 9…6 CEvent 类的成员函数
函数名称 作用
CEvent 构造函数,构造 CEvent 对象
SetEvent 启动事件对象,释放等待线程
PulseEvent 启动事件对象,释放等待线程,或者重置事件
对象为未激活状态
ResetEvent 设置事件对象为未激活状态
Unlock 释放事件对象
4 .互斥器(Mutex )
互斥器的功能与临界区相似。区别在于互斥器所花费的时间比临界区多很多,但是互斥
器是核心对象(后面介绍的 Event 和 Semaphore 也是核心对象),可以跨进程使用,而且等待
一个被锁住的互斥器可以设定 TIMEOUT,不会像临界区那样无法得知临界区的情况,一直
等待。
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 ·
…………
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!