线程技术在电话语音查询系统中的应用
2009-01-06梁宇恩梁启来
梁宇恩 梁启来
[摘 要]本文采用线程技术设计了农产品电话语音查询系统,实现了农产品追溯码校验、追溯记录查询和语音合成,系统工作效率较高,运行稳定。
[关键词]线程 数据库 追溯系统
[中图分类号]TP311[文献标识码]A[文章编号]1007-9416(2009)11-0035-01
1 关于线程
线程是指进程中的一个实体,也可以理解为程序中单一的顺序控制流,是被系统独立调度和分派的基本单位。线程与进程不同,它不拥有系统资源,只能与同属一个进程的其它线程共享该进程的系统资源。应用线程技术可编制支持并发操作的应用程序。
线程主要包括线程体、线程状态和线程优先级。线程的主要操作均包含在线程体内,以C++ Builder TThread类为例,线程初始化后,Execute()方法将被调用。在继承的Execute()方法中的代码就被执行。线程状态包括新建状态、运行状态、阻塞状态和死亡状态,表示了线程从创建到消亡的整个生命周期。新建线程对象后,线程处于新建状态,这时还没有分配系统资源给线程。调用线程Execute()方法使线程进入运行状态,由系统调度线程使用CPU。线程处于阻塞状态时,它不会被分配CPU时间而无法执行,也就是被挂起。正常情况下,线程Execute()方法执行完毕后,线程进入死亡状态,释放占用资源。线程的优先级表示该线程的重要程度,优先级高的线程获得CPU时间的机会更大。
多个线程往往要访问同一系统资源,因此如何同步多个线程访问系统资源就非常重要。在Windows操作系统下,线程同步的方法有临界区、事件、互斥对象和信号量。
应用程序如果访问通讯端口或者数据库等数据吞吐速度相对较慢的资源时,多线程应用程序是非常有利的,但是需要注意多线程并不能提高CPU的处理能力。
2 语音查询系统线程设计
利用线程技术可以使应用系统具备实时处理多任务的能力,所以在开发农产品电话音查询系统的过程中,用线程技术较好的满足了系统开发需求。农产品电话语音查询系统主要功能如下:
(1)处理用户拨入电话,记录来电号码和用户输入的农产品追溯码。
(2)查询来电归属地。
(3)查询追溯码所属企业,验证追溯码有效性。
(4)查询追溯码对应的农产品追溯记录。
(5)对追溯记录进行语音合成。
(6)向用户播放追溯记录,登记查询信息。
农产品语音查询子系统要能实时处理16路接入电话,所以系统主程序部分是以轮询方式查看电话语音卡16路端口有无电话接入,并且还要将合成的语音向指定端口播放。如果语音查询子系统功能(2)~功能(5)全部放在主程序部分实现,那么势必造成接入电话和播放语音执行时发生拥塞,导致系统无法正常处理业务。原因是访问数据库与语音合成都是比较耗时的操作,全部放在主程序中执行是不合适的。为了解决这个问题,采用线程技术是一个比较好的办法,具体做法是将功能(2)~功能(5)放在另外一个辅助线程中实现。由于开设太多辅助线程会降低查询子系统的效率与可靠性,所以本文只建一个辅助线程。农产品语音查询子系统辅助线程部分流程图如图1所示。
辅助线程执行代码开始部分先检查同步事件是否被主程序触发,如果同步事件被触发,首先重置同步事件,然后取出主程序线程安全队列内的任务请求数据块,根据任务代码调用辅助线程相应的成员函数完成请求功能。辅助线程提供4个成员函数,实现来电归属地查询、追溯企业代码查询、农产品追溯记录查询和TTS(Text To Sound)语音合成。如果同步事件没有被触发,则在一个指定的时间周期后继续检查同步事件是否被触发。
3 实现方法和结果
(1)辅助线程要经ADO组件访问SQL Server数据库,所以线程Execute()方法开始处应加入CoInitialize()调用,线程销毁前要调用CoUninitialize(),防止访问数据库失败。
(2)检查同步事件触发部分要判断各种情况。首先要判断检查同步事件的过程是否超时,如果超时则表明该时间段内主程序没有触发同步事件,需要返回重新再次检查。其次,如果同步事件被触发,则要立即重置同步事件,然后打开主程序中的线程安全队列,将主线程加入的任务请求数据块取出。接着判断请求任务代码,调用相应成员函数,修改队列数据块指针内容,返回查询数据。最后如果辅助线程异常,则自动退出。
(3)辅助线程对象由new()指令创建,删除时采用自动销毁方式。
经过实测,采用线程技术的农产品电话语音查询系统工作稳定,可以正常处理16路外线电话拨入的查询追溯记录请求,用户平均等待时间小于1秒,极端最长等待时间为5秒,符合实用要求。
4 结语
本文采用线程技术实现了农产品电话语音查询系统,具有占用资源少,工作效率高,运行稳定等特点,能够较好的满足用户查询需求。但是线程应用程序调试比较复杂,本文采用将中间数据写入文本文件的方法调试程序。另外,检查同步事件是否触发的时间周期值如何设置才能使系统工作最有效率,这是后续工作中需要解决的问题。
[参考文献]
[1] John M,Tom C, Harold H. Borland C + + Builder编程指南[M].北京:电子工业出版社,1998.420-517.
[2] 何鹏飞.Delphi 8程序设计教程[M].北京:清华大学出版社,2004.262-290.
[3] Bruce Eckel,Java编程思想[M].北京:机械工业出版社,2002.594-636.
[4] 王继军.法国畜产品质量追溯的做法与思考[J].中国农垦,2008,8(1):25-28.