1.2 国内外研究历史及现状
1.3 课题研究的意义
在全国人民身体素质测试中人体反应时间是一个重要的指标。经过检测人体的反应时,能够测定人们身体神经系统反应的快慢,因此能够体现出人体的身体素质,健康情况[3]。员工的反应时间这一指标对一些行业非常重要,比如司机,运动员。对他们进行反应时间的测量有利于更好的工作。反应时间在许多环境中得到应用,像机动车司机反应测试仪,药品药理反应测试仪。
2 问题分析与分析
2.1多个图形动态显示
为了实现多个图形的在屏幕上动态显示,一开始考虑使用定时器,通过一个定时器来控制一个图形的移动。选择定时器主要是因为其使用起来方便,只要设定响应的时间间隔和OnTimer事件就能工作。其实软件定时器从原理上来说是处理位于消息循环中的WM_TIMER消息,在消息队列中WM_TIMER属于一个级别比较低的消息,因此定时器不能够彻底实现处理时间间隔的精确度[4]。更为重要的是主线程的资源会被Timer占用,Timer的事件响应其实是串行,因此属于窗体的消息队列如果出现阻塞,程序将处于假死或者运转迟钝的状态,用户界面产生这样的问题是不能接受的。而多线程是抢占式,由时间轮片处理的,不会出现界面顿卡现象。而且线程中使用如下
while(1)
{
Sleep(1000);
....
}
可以起到定时作用。
2.2 多线程同步
当在程序中运用到多线程时,通常情况下有比较少的线程会在它的生命期内完全独立地运行。更普遍的情形是某些线程对一些数据进行访问时,别的线程需要对它的操作情况进行获取。通常情况下对这些信息的获取应该在它操作过程完成后启动。假如不选择合适的操作,别的线程经常会在线程操作过程结束前就去获取操作信息,这种方式相当大地可能导致获取到的操作结果错误。比方,许多线程同一时间对同一个全局变量进行操作,假如它们只是采取读取操作,那么不会产生错误。但是当其中一个线程需要更改全局变量的值,而别的线程需要同时获取变量值时,就无法做到得到的变量值是通过写线程更改后的值。
为了做到读线程得到的是通过更改后的变量值,就需要在向变量写入数据时不允许别的线程对它进行任何操作包括读和写,等到写数据操作完成后再给予别的线程访问权利。这类能够做到线程能得到别的线程操作过程完成后的处理结果而使用的保护方式就是线程同步。
线程的同步根据采取方式中对象所在位置不同分为用户态的线程同步和内核对象的线程同步两大类[5]。因为操作的对象不涉及内核,所以它的优点是同步速度比较快,在对线程执行速度有很高要求的情况下比较试用。
采用内核对象实现线程同步主要利用事件,信号量等内核对象完成。因为此类同步方式采用了内核对象,操作时需要把线程从用户态更换至内核模式,而这类更换通常会花费大约几千个CPU周期,所以同步的速度会比较慢,但它的优点在于相较于用户态下的线程同步机制,其适用性要高很多。
1.关键代码段
关键代码段(Critical Section)是对一些共享资源独占访问的代码块,在所有时间点都只能有唯一的线程对共享资源采取操作。当有不止一个线程想要同一时间对关键代码段进行操作,那么当某个线程进入关键代码段后,所有别的想要进入此关键代码段的线程会被挂起,并且会挂起到进入关键代码段的线程离开。上述线程离开关键代码段后,别的线程就能够抢占,从而实现用原子方法访问共享资源的目标。关键代码段在运用的时候使用CRITICAL_SECTION结构对象对共享资源进行包含,同时分别用EnterCriticalSection()和LeaveCriticalSection()函数来标记和离开一个关键代码段。为了使用CRITICAL_SECTION结构对象,需要先通过InitializeCriticalSection()对其进行初始化,然后才能使用它,而且需要保证将所有线程中想要对共享资源进行访问的代码都放在此关键代码段下[6]。不然关键代码段不能够保证共享资源得到保护。 MFC员工反应时间检测评测系统的实现(2):http://www.youerw.com/jisuanji/lunwen_13193.html