visual c++利用互斥量同步线程实现文件读取进度条

visual c++利用互斥量同步线程实现文件读取进度条

ID:6579352

大小:506.00 KB

页数:10页

时间:2018-01-18

visual c++利用互斥量同步线程实现文件读取进度条_第1页
visual c++利用互斥量同步线程实现文件读取进度条_第2页
visual c++利用互斥量同步线程实现文件读取进度条_第3页
visual c++利用互斥量同步线程实现文件读取进度条_第4页
visual c++利用互斥量同步线程实现文件读取进度条_第5页
资源描述:

《visual c++利用互斥量同步线程实现文件读取进度条》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、VisualC++利用互斥量同步线程实现文件读取进度条本文适合中级读者一、前言        文件读取进度条的实现可以有很多种方法,常用的是在读取文件的过程中隔一定时间向对话框发送消息以控制进度条的位置,但是这种方法很难确定隔多少时问发送一个消息,因为文件的大小是不确定的,时间间隔长了可能文件已经读取完了还没有发送消息,而消息发送得太频繁又会影响文件读取的效率。特别是在读取文本文件时你可能需要在每一个ReadString()函数之后都要发送一个消息,而在一些格式比较复杂的文件读写代码中(例如dxf文件的读取),这样的读取函数

2、循环可能有几十处,在这样的代码中发送消息是很繁琐的事情。而利用线程同步则可以很好地解决这个问题。        进程是一个可执行的程序,由私有虚拟地址空间、代码、数据和其他操作系统资源(如进程创建的文件、管道、同步对象等)组成。一个应用程序可以有一个或多个进程,一个进程可以有一个或多个线程,其中一个是主线程。        线程是操作系统分时调度分配CPU时问的基本实体。一个线程可以执行程序的任意部分的代码,即使这部分代码被另一个线程并发地执行,一个进程的所有线程共享它的虚拟地址空间、全局变量和操作系统资源。        

3、创建一个新的进程必须加载代码,而线程要执行的代码已经被映射到进程的地址空间,所以创建、执行线程的速度比进程更快。另外,一个进程的所有线程共享进程的地址空间和全局变量简化了线程之间的通信,所以以线程为调度对象要比以进程为调度对象效率高。但是在几个线程并行运行时,可能会存在线程的同步问题。例如:两个线程同时对一个全局数组进行操作,线程A取得对该数组的控制权对数组进行写入,当写入还未完成时,控制权又由线程B取得,线程B改变了该数组的数据,然后线程A又取得控制权进行读取,这样线程A获取的数据可能并不足其所需要的数据,这时就要用线程同

4、步来解决这个问题。        Windows提供了几种同步对象来实现线程的同步,常用的有临界区(criticalsection)、互斥量(mutexe)、信号量(semaphore)、事件(event)和可等待的记时器(waitabletimer)等。线程主要使用两个函数将它们设为睡眠来等待内核对象变为有信号:DWORDWaitForSingleObject(HANDLEhObject,DWORDdwTimeOut)DWORDWaitForMultipleOblects(DWORDcObject,LPHANDLElpHa

5、ndles)        函数WaitForSingleObject告诉系统线程在等待由参数hObject标识的内核对象变为有信号。参数dwTimeOut告诉系统线程愿意等待多少毫秒。如果指定的内核对象在指定时间内没有变为有信号,系统就会唤醒线程,让它继续执行。函数的返回值有3种:WAIT_OBJECT_0表示对象达到有信号状态;WAIT_TIMEOUT表示对象在dwTimeOut毫秒内未达到有信号状态;WAIT_ABANDONED表示对象是一个互斥量,由于被放弃而达到了有信号的状态。二、实现方法        首先我们声

6、明一个全局的文件指针g_pFile以存放要读取的文件指针,然后在主线程中指定要读取的文件,初始化g_pFile,并进行进度条对话框的创建。然后打开两个线程ReadDxfThreadProc(LPVOIDlParam)和SetProgressPosThreadProc(LPVOIDlParam),第一个线程用来读取文件,第二个线程则通过g_pFile指针来判断当前文件指针的位置,并向对话框发送消息以控制进度条的位置。这样我们将文件读取和向对话框发送消息分离,就不必在每个文件读取语句后都发送消息了,而且文件读取的效率也较高:  

7、      在编码过程中有以下几个问题要注意:        (l)在创建两个线程的时候必须将它们的优先级设置为同级,否则会造成一个线程已经结束了而另一个线程还没有开始。        (2)由于两个线程都要用到g_pFile指针,因此需要对两个线程进行同步,否则会出现异常。在本实例中我们利用互斥量来对两个线程进行同步。在声明全局文件指针的同时我们也声明一个互斥量句柄:HANDLEhMutex=NULL,并在主进程打开线程之前创建互斥量,对g_hMutex进行初始化:g_hMutex=CreateMutex(NULL,FAL

8、SE,NUlL);        (3)由于本实例中进度条对话框使用的是非模态划话框,因此除了需要定义设置进度条位置的消息响应函数之外,还需要定义销毁对话框的消息响应函数。        (4)在线程SetProgressPosThreadProc中我们通过全局变量g_pFile来探测文件

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。