按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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