第一篇:银行排队系统的优化
题目:银行排队系统的优化
论文通过分析银行售票窗口的排队系统实例,根据排队系统的数量指标银行售票处的排队系统,确定售票窗口的开设个数。首先通过题目所给数据确定单位时间到达的顾客人数和每位顾客在售票窗口前的服务时间分别服从Possion分布和双参数指数分布,从而确定排队系统符合n个M/G/1排队系统模型;接着通过排队系统的数量指标确定银行设立售票窗口个数的最优值,得到的是系统效率较高且成本较低,并提出能使顾客达到满意最大化的方案,最后提出论文中解决排队问题方法的普适性。
关键字:排队论分布拟合检验M/G/1模型最优化客户满意度
一、问题重述
1.1背景分析
随着我国加入WTO以后,国有银行的日益壮大,各种商业银行的创办,银行为了经营效益,将不高的营业网点拆并,网点资源减少后,客户流进一步像现有网点集中,导致客户排队现象突出,造成客户等待时间过长,引发服务投诉和存款的流失。本文结合我国银行营业厅排队问题的现状,利用排队论原理及其模型对排队服务制度上的问题进行剖析,找出最优方案,旨在提高银行服务质量和最大收益。1、2问题重述
此题对已给的顾客到达时间和银行服务时间,研究符合经理的条件:期待顾客平均等待时间小于2分钟,平均队列长度小于等于2人,在给定的每天大约150名顾客的前提下提供服务,第一问是建立银行排队系统的优化模型,第二问是给出能提高顾客满意度的优化方法,以此达到经理的的目标。
二、问题分析
第一问是要我们建立银行排队系统的优化模型,我们认为这里有必要引进排队论的知识。
三、模型假设
1、影响排队系统的因素是很多的,不包括特设或突发情况,如:顾客蛮不讲理或遭遇灾难等;
2、顾客一个一个到来,不同顾客之间到达相互独立
3、顾客服务方式为一个一个进行的,采用先到先服务的原则
4、每位顾客的服务时间长度是随机的,其分布对时间是平稳的
5、一个窗口可以办理多项业务
6、排除银行地理位置的影响因素
四、符号说明
(1)Ls:平均队长:指系统内顾客数(包括正被服务的顾客与排队等待服务的顾客)的 数学期望;
(2)Lq:平均排队长:指系统内等待服务的顾客数的数学期望;
(3)Ws:平均逗留时间:顾客在系统内逗留时间(包括排队等待的时间和接受服务的 时间)的数学期望;
(4)Wq:平均等待时间:指一个顾客在排队系统中排队等待时间的数学期望;
(5)Tb:平均忙期:指服务机构连续繁忙时间(顾客到达空闲服务机构起,到服务机 构再次空闲止的时间)长度的数学期望;
(6)s:系统的服务强度;
(7)Cs:单位时间内每个服务台的成本费;(8)Cw:单位时间内的总分费用的期望值;(9)W:系统中顾客总的等待时间
五、模型的建立与求解
设顾客单个到达,相继到达时间间隔服从参数为λ的负指数分布,系统中共有s个 服务台,每个服务台的服务时间相互独立,且服从参数为μ的负指数分布。当顾客到
达时,若有空闲的服务台则马上接受服务,否则便排成一个队列等待,等待时间为无限。
pPNn下面来讨论这个排队系统的平稳分布。n(n=0,1,2,3,…….)为系统
达到平稳状态后队长N的概率分布,注意到对个数为s的多服务台系统,有
n,n0,1,2,...n
记s
n,n0,1,21...ss,ns,s1,....
s
.....0
则当s1时,由Cnn1n2,n1,2,......snn1.....1
pnCnp0,n1,2,...p0
11Cn
n1
得到:
()n,n1,2,...,s
n!
Cnns
,ns()s!snss!s
所以
n
,n1,2,...,sn!0
pnn
p,ns
s!sns
其中
s1nsp0
n!s!(1)sn0
1
由前面的公式给出了在平衡条件下系统中顾客数为n的概率,当ns时,即系统中顾客
数大于或者等于服务台个数时,这时再来的顾客必须等待,因此记
cs,pn
ns
s
s!1sp0
平均排队长
p0s
Lqnspn
s!ns1
ns
ns
ns
s
p0sdnp0sss2
s!dsn1s!1s
记系统中正在接受服务的顾客平均数是s,显然s也是正在忙得服务台平均数,所以
s1n1s1nns
snpnspnp0sp0p0n1!s1!1ss!1sn0nsn0n!n1s1
s
1上式说明,平均在忙的服务台个数不依赖于服务台个数s平均队长Ls=平均排队长+正在接受服务的顾客的平均数=Lq平均逗留时间和平均等待时间分别为
Ws
Ls
,Wq
Lq
Ws
六、模型检验
七、模型评价与改进
7.1模型的优点和缺点 7.1.1缺点
1、我们并没有考虑到顾客的主观因素;
2、排除了银行位置和突发事件的不确定性因素;
3、对人数上限的约束较难实现; 7.1.2优点
1、我们通过分析的的道理了满足条件的最优窗口数;
2、提出了满足顾客需求的最优方案;
3、该模型适用于多种排队系统,具有普适性; 7.2改进
八、模型推广
应用排队轮的理论和方法对服务机构进行定量分析评价,优化服务系统质量,提高效率,为设备的合理配置和有效利用提供科学的依据,这是进行布局规划和可行性分析的一种有效途径。该模型同样适用于各种排队系统,如火车售票系统,超市排队系统
九、参考文献
【1】杨米沙,银行排队系统分析及窗口设置优化研究,武汉理工大学学报,2008 【2】刘卫国,MALAB程序设计教程,中国水利水电出版社,北京,2005 【3】唐映辉,排队论(基础与应用),电子科技大学出版社,成都,2000 【4】
附录
第二篇:银行排队
以人为本,解决银行排队问题
近年来,随着经济的快速发展和人们生活水平的提高,银行排队的问题凸显出来。在一些大城市、繁华地带和高峰时段,往往会出现排长队的现象,办理一次银行业务要等好长时间。这种现象降低了人们的办事效率,加大了交易成本,解决这个问题成为各方关注的焦点。
银行排队问题之所以如此突出,其原因是多方面的:其一,随着经济的发展,银行的业务出现复杂化的趋势,各种代收代缴的业务,各种金融理财产品加大了银行的负担;其二,银行的服务态度和服务效率存在一些突出问题。银行职员服务的主动性和业务的熟练程度有待加强,银行窗口设置不够合理和有效,银行操作流程比较繁琐,自助服务设施还不够广泛;其三,银行和社会部门的金融业务有效对接存在问题,社会部门的金融业务往往没有统一的标准,这导致了银行处理此类业务效率较低,本可以通过批处理解决的业务却只能单独手动解决,大大降低了效率。另外,广大客户对自助设备不习惯使用、银行对相关业务流程的宣传不到位也是重要原因。
银行排队问题反映了银行的服务水平和整个社会的协调能力,关系到广大公民的日常生活,我们必须采取切实有效的措施解决好这个问题。
第一,银行部门要有服务意识,要把客户是上帝的理念落到实处,银行不仅是商业部门,而且是窗口部门,是服务部门,银行必须要加强自律,要为客户提供优质的服务。要有效整合现有的资源,在人员配置和网点配置上实现优化,要对员工加强教育培训,提高他们的业务素质和服务意识。要配备好大堂经理,以有效指导银行客户选择合适的服务方式,以节约客户的时间,提高银行的效率。
第二,要增加相关方面的投入,在大城市、繁华地段增加网点,增设自助设备,增加服务人员,要加大宣传力度,引导公众使用电话银行、电子银行等新业务方式提高业务效率,要在银行设定排号器等设施实现业务有序,要为等待的客户提供休息和娱乐的服务。
第三,要有效整合社会资源,银行要推动制定金融业务的统一规范标准,实现银行和社会部门的无缝对接,要对客户进行宣传教育和引导,对客户的简单业务尽量说服通过自助设备进行,要通过宣传单、标语指示牌等丰富多样的方式对公众进行服务引导。要引导公众尽量避免高峰时段办理业务。
第四,监管部门和行业组织要加强对银行部门的管理和引导,要对银行系统内的资源进行有效整合,各银行网点和自助服务系统要实现有效对接,实现联通服务。要吸收借鉴国内外的先进经验,加强与优秀跨国公司的交流与合作。
总而言之,解决好银行排队的问题是贯彻以人为本理念的重要体现,解决这个问题,银行增强服务意识是关键,全社会联动、协调和配合是重要保障。相信通过我们的努力,这个问题会得到逐步解决。
第三篇:银行排队系统需求分析报告
银行排队系统需求分析报告
1.引言
编写目的
随着时代的发展,信息技术在各服务行业中的重要作用得到充分体现,通过服务模式的信息化,可以极大提高服务质量,节约人力成本,提高工作效率。
本产品是针对银行的排队取号业务而开发的新一代银行排队系统。本产品较现有的银行排队系统在功能上有一定的扩充,这体现在用户端用户体验的提升以及银行内部管理人员的管理效率的提升。
本产品目前版本号:ver.1.0 1.2项目风险 1.3 文档约定
1.4 预期读者和阅读建议 用户:各大银行
开发人员:熊宇轩,蒋雅楠,刘昕
项目经理:王萌
营销人员:暂缺
测试人员:蒋雅楠
文档编写入员:熊宇轩 1.3定义
静态数据:系统固化在内的描述系统实现功能的一部分数据。动态数据:在软件运行过程中用户输入的后系统输出给用户的一部分数据,也就是系统要处理的数据。
数据字典:数据字典中的名字都是一些属性与内容的抽象和概括,它们的特点是数据的“严密性”和“精确性”,没有半点含糊。1.4参考资料
NEUSOFT实习资料
2任务概述
2.1目标
本系统的设计目标是能够实现客户银行排队取号,柜员柜台叫号功能,并且使银行管理者能够查询排队记录。系统应该具有简单,易用,小巧,经典的特色,应该能够对银行排队取号业务进行优化,使其系统化,高效化,智能化。并保证工资管理的准确性,简易性,为学校财务人员提供便利。相应的需求如下:
(1)普通客户排队取号
(2)VIP客户优先取号
(3)移动端预约客户身份验证取号
(4)柜员叫号
(5)客户对柜员服务进行评分
(6)数据的统计,并且在经理客户端显示数据
(7)经理手动插队权限
(8)登录信息管理。(9)人性化服务体验提升功能 本软件系统的开发设计思想是:
1.系统应符合银行管理的规定,满足银行客户和管理人员的需要,并达到操作过程中的直观、方便、实用、安全等要求;
2.系统采用模块化程序设计方法,既便于系统功能的各种组合和修改,又便于未参与开发的技术维护人员对其进行补充、维护;
3.系统应具备数据库维护功能,及时根据用户需求进行数据的添加、删除、修改、备份等操作。
2.2用户的特点
本软件的最终用户是各银行网点,由于该单位的员工的学历、素质较高,具有一定的计算机操作技能。本软件需要至少一名系统管理人员,由于本软件系统的易用性,并不需要受过专业训练人员。
2.3假定和约束
由于本软件系统较小,且在linux系统下采用c 语言开发,故在一般环境下基本没有什么限制。
一个更为完善的工资管理系统,应提供更为便捷与强大的信息查询功能,如相应的网络操作及服务,由于开发时间和计算机数量有限,该系统并未提供这一功能。对信息的保护手段仅限于设置用户级别,以及提供数据文件的备份,比较简单,不能防止恶意的破坏,安全性能有待进一步完善。
3需求规定
3.1对功能的规定
3.1.1功能模块及描述
本系统主要功能模块如下,系统功能模块图如图: 1)用户排队取号模块
叫号机当前服务信息: 普通用户VIP用户预约用户 图1-1 该模块可以实现普通用户取票,VIP 用户取票,移动客户端预约用户身份验证取号业务。三个按钮对应三个不同的服务客户对象类型,右侧的对话框显示当前叫号情况。
普通用户和VIP用户会跳转至图1-2所示的页面
窗体标题负债业务当前等候人数资产业务当前等候人数中间业务当前等候人数
图1-2-1
三个按钮对应不同的业务类型,按下之后就可以取票,通过socket通信将排队请求上传到服务器,并在服务器端口进行多线程任务管理,自动为客户分配排队号码。负债业务对应柜台1-3,资产业务对应4-6,中间业务对应7-9。
图1-2-2 预约用户可跳转至图1-2-2的界面,输入手机号和验证码来验证信息,并且取已预约的号
2)员工叫号模块 叫号界面正在为 服务叫号正在呼叫下一个
图1-3 员工可使用图1-3所示界面进行叫号,叫号按钮按下之后,会自动生成正在呼叫的客户排队号码。为了防止有的客户取号之后又离开银行的废票现象的发生,我们设置了跳转至下一个排队用户的按钮。右侧的对话框显示正在服务的客户,在柜员对面的客户服务端按下开始服务按钮之后,柜员的正在呼叫对话框内将被置空,而有侧的对话框会显示相应服务信息。
3)用户服务模块
用户界面评分1开始服务2345结束服务
图1-4 开始服务和结束服务按钮对应柜员端相应功能,在按下结束服务按钮之前,用户要通过右侧的按钮对服务进行评分。评分情况和服务时间可在经理端显示
4)经理管理模块
业务情况排队情况业务分类序号刷新插队退出排队号取号时间已等候时间负债业务已受理情况资产业务柜员评分信息统计中间业务
图1-5-1 经理可使用图1-5-1所示界面来查看当前排队信息,并且可以通过上方的插队按钮帮助特殊客户插队。业务情况排队情况业务分类序号刷新插队退出排队号开始时间结束时间负债业务已受理情况资产业务柜员评分信息统计中间业务
图1-5-2 经理可以通过左侧的已受理情况按钮查询以往客户的排队情况。业务情况排队情况业务分类柜员号刷新插队退出姓名已受理人数平均分负债业务已受理情况资产业务柜员评分信息统计中间业务
图1-5-3 经理可以通过评分按钮来查看客户对柜员的评分情况,便于内部考核使用。信息统计排队情况已受理情况柜员评分信息统计刷新
图1-5-4 经理可以查看总体的数据统计概要。
5)柜员/经理登陆模块
柜员登陆柜员号密码登陆 系统可以通过查询数据库中的记录来识别柜员/经理的身份。
4.业务流程图
系统的业务流程图如下图所示:
普通用户取号VIP用户取号插队插队插队负债业务资产业务中间业务预约用户取号等待叫号插队柜员叫号开始服务经理结束服务返回记录客户评分5.数据库管理
5.1 动态数据描述 输入数据:菜单选项,查找关键字,新建记录项。输出数据:由查询关键字确定的数据库记录集合。内部生成的数据:中间查询结果。数据库描述
5.2数据库描述
本系统使用MySQL数据库
第四篇:银行排队叫号系统需求分析 设计文档
银行排队叫号系统的分析与UML建模
一、需求分析
近年来,由于各行各业的信息化、智能化建设越来越普及,整个社会对各个行业的办事效率的要求也越来越高。例如像银行办业务,在顾客办业务过程中排队现象在所难免,为了在排队时减少顾客的等待时间,为顾客办业务创造一个良好的环境,银行排队叫号系统应运而生。银行排队系统的功能性需求包括以下内容:
1、排队系统可以分为票务打印系统和窗口操作系统。
2、票务打印系统(1)显示
发号机上的显示屏使用液晶显示,显示对待办业务的选择;(2)输入
输入过程即通过触摸屏对业务进行选择的过程;(3)输出打印
号票打印内容应该包括业务名称、排队号码、时间等;
3、窗口操作系统基本包括显示屏、语言提示,叫号按钮(1)显示屏
使用点阵式LED显示,显示内容应该是下一个号码以及办理业务窗口;(2)语音提示
语音播报时用语音的形式通过广播或者音箱给人一提示信息。语音提示不需要用户一直盯着提示屏或者排队情况。选择使用语音芯片,实现的功能应该是当操作员按下按钮后,语音播放下一个办理者的票号。(3)叫号按钮
设置叫号按钮,以便于操作员控制窗口模块的显示屏及语音提示。满足上述需求的系统主要包括以下几个小的系统模块:
(1)派号功能模块。派号功能模块主要是用于在用户进入服务大厅后,根据自己的业务需要,通过自助式触摸屏号票机领取票号;或者用户在服务大厅业务咨询台进行业务咨询后,咨询员可以为用户打印排队号票。号票是由排队服务器根据当前情况自动生成。
(2)叫号功能模块。工作人员可以通过座席软件键盘上的设置键对客户进行叫号;也可通过按键控制器对客户进行叫号;系统可以设置单语或双语进行语音播放;以及通过LED显示屏和其它视频显示设备显示票号。
(3)预约功能模块。用户可以通过电话预约领取排队号;预约成功后取得预约号;系统将此预约号按预约时间插入当前的排队队列,在系统处理后进行优先呼叫;在同时间下办理业务时,可以进行预约服务,优先办理。同时用户可以在网上进行预约。用户可以在正常受理业务的工作日和系统进行网上预约。系统将此预约日期的预约号检索到排队序列中。
(4)管理功能模块。实现窗口灵活安排,根据业务需要设置叫号规则;业务分类排队管理;鼠标、键盘、按键控制器混合使用。可以按业务和窗口分类统计业务办理情况。
二、用例图
● 客户能够通过该系统进行如下活动:
(1)顾客取票:需要办理业务的顾客到取票机前取号,并获得打印。(2)顾客休息等待:取到排队号的顾客在休息区休息等待,留意显示屏信息和语音提示。
(3)营业员按钮呼叫:窗口操作员按“下一位”,当前窗口就显示顾客排队号并语音呼叫“请XX到X”。(4)顾客到窗口办理业务:休息区的顾客听到呼叫就到相应窗口进行一对一服务。
根据以上的描述画出相应的用例图如下:
三、系统类图 我们可以识别系统中存在的主要实体类:顾客,柜台营业员,维修管理员,保安。界面类:取票机。
根据以上的描述画出相应的类图如下:
四、系统动态模型 顾客取号排队办理业务工作流程:
(1)取号:顾客取一张号票,上面有号码、时间、办理的业务类型等(2)休息等待:持号票在休息区休息并留意显示屏音箱叫号。(3)按键叫号:工作人员办完一笔业务后按下叫号器上的下一位按钮(4)前去办理:叫号时根据显示屏音箱的信息到指定位置享受一对一的服务。根据以上的描述画出序列图如下:
柜台营业员办理业务工作流程:
(1)登 录:工作开始前,输入员工代码进行登录。(2)退 出:在工作结束后,退出系统。(3)顺 呼:呼叫第一位或下一位顾客。
(4)重 呼:第一次呼叫顾客时没有响应,重新进行呼叫。
(5)转移窗口:对单一业务队列可在窗口间进行转移;对多业务队列,不但可以在本业务队列窗口间转移,还可以在不同的业务队列窗口间转移。(6)优先呼叫:碰到紧急或有特殊关系的顾客,可优先呼叫。
(7)回 呼:顾客错过机会或需多柜台服务时,键入其号码进行呼叫(注:回呼的号码必须是已被呼叫过的号码)。(8)弃 号:多次呼叫后,顾客依然没有响应,可能顾客已弃号,然后呼叫下一位顾客。
(9)询 问:查询当前等待人数。根据以上的描述可画出序列图如下:
管理员管理业务工作流程:
(1)系统管理:对系统中排队机、显示屏、座席及其它与系统相关的硬件进行管理;
(2)管理顾客动态:可实时提供当前各部门所有顾客取号时间、服务情况和等待人数等有关参考信息;
(3)员工效率管理(即监督工作):可获知员工几时上班、几时下班、服务人次、平均和最长及最短服务时间等有关信息;
(4)统计:统计多种有价值的信息,供管理层决策参考
五、状态图 排队叫号系统包含以下六种状态:顾客到达、取票、等候办理、办理业务、柜员呼叫、顾客离去。它们之间的转换规则是:
(1)需要办理业务的顾客到达取票机前取票,并获得打印。
(2)取到排队号的顾客在休息区休息等待,留意显示屏信息和语音提示。(2)柜台营业员办完一笔业务后按下叫号器上的下一位按钮。(3)叫号时根据显示屏音箱的信息到指定位置前去办理业务。(4)办理完业务后即可离开。根据以上的描述可绘制出状态图如下:
六、活动图 顾客对象的活动图:
(1)顾客在取票机的界面上输入选择所需办理的相关业务。
(2)界面将信息传递到控制业务逻辑的对象中心显示屏(动态显示所有等待服务的顾客号码以及相关的业务信息)进行验证,然后传递到窗口显示屏(显示顾客、业务受理员号码及宣传、服务用语)。(3)窗口显示屏获得到的信息显示顾客办理业务的详细信息。柜员对象的活动图:
(1)柜员获取中心显示屏传递过来的信息,然后通过对象呼叫机进行按键呼叫。(2)叫号时顾客根据显示屏音箱的信息到指定位置前去办理业务,办完业务后即可离开。
管理员对象的活动图:
(1)可实时提供当前各部门所有顾客取号时间、服务情况和等待人数等有关参考信息。
(2)可获知员工几时上班、几时下班、服务人次、平均和最长及最短服务时间等有关信息,进行监督。
(3)可监督维修人员对系统中排队机、显示屏、座席及其它与系统相关的硬件进行管理。
通过以上的描述可绘制出活动图如下:
七、系统构件图 在排队叫号系统中,可以对参与者和主要的业务实体类分别创建对应的构件进行映射。我们前面在类图中创建的顾客类、柜台营业员类、系统管理员类,所以可以映射出相同的构件类,包括顾客构件、柜台营业员构件、排队叫号系统构件,此外,还必须有一个主程序构件。由以上描述可绘制出构件图如下:
八、系统部署图 在排队叫号系统中,系统包括四个节点,分别是:主控箱节点,对系统中排队机、显示屏、座席及其它与系统相关的硬件进行管理;排队机节点,提供顾客排队取号的票据;叫号器节点,提供给柜台营业员通过叫号机对客户进行叫号;窗口显示屏节点,用于动态显示所有等待服务的顾客号码以及相关业务的信息;音箱节点,用于提示顾客办理相关业务。由以上描述可绘制出部署图如下:
第五篇:c++版模拟银行窗口排队叫号系统
c++版模拟银行窗口排队叫号系统
c++版模拟银行窗口排队叫号系统
看了两位LZ的银行排队系统blog,感觉不错,就也产生了用C++写个排号系统,原因有二,1、对Java不太熟悉,没有看太懂。
2、练练手。
3、提高一下C++的人气。进入主题:
对于这一块的业务系统需求没有做过多的分析,只在两位LZ的基础做了小小的改动,然后用C++实现。题目:
模拟实现银行业务调度系统逻辑,具体需求如下:
银行内有6个业务窗口,1-4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。
有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。
异步随机生成各种类型的客户,生成各类型用户的概率比例为: VIP客户:普通客户:快速客户 = 1 :6 :3。
客户办理业务所需时间有最大值和最小值,在该范围内随机设定每个VIP客户以及普通客户办理业务所需的时间,快速客户办理业务所需时间为最小值(提示:办理业务的过程可通过线程Sleep的方式模拟)。
各类型客户在其对应窗口按顺序依次办理业务。
当VIP(6号)窗口和快速业务(5号)窗口没有客户等待办理业务的时候,这两个窗口可以处理普通客户的业务,而一旦有对应的客户等待办理业务的时候,则优先处理对应客户的业务。
随机生成客户时间间隔以及业务办理时间最大值和最小值自定,可以设置。
不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。修改:
1、在这里为了简化程序的设计(只省了只行代码),FAST和VIP窗口只办理对应的客户,不办普通客户的业务。
2、由于对于客户的到来,也采用1S来一个的做法,但因为在console程序对于时间不太好控制,在这里只是设定了客户数,即每个1秒来一个客户,根据来的客户数控制时间。
开发环境:Linux 代码:
文件constances.h 该文件中定义了一些常量,其中MAX_WAITING_CLIENT_NUM指的是,最多正在等待的客户数,如果客户数到达最大,后来的客户将会离开。
[cpp] view plaincopy
1.#ifndef CONSTANCES_H_
2.#define CONSTANCES_H_
3.enum {
4.MAX_SERVICE_TIME = 10, 5.MIN_SERVICE_TIME = 1, 6.CLIENT_INTERVAL_TIME = 1, 7.MAX_WAITING_CLIENT_NUM = 50, 8.MAX_CLIENT_NUM = 100, 9.};
10.#endif /* CONSTANCES_H_ */
文件main.cpp
1、每一个窗口对应一个线程,在此创建了6个线程,分别对应4个客户窗口,1个FAST窗口中,1个VIP窗口中。
2、在这里本想用Unix中的alarm信号来控制客户的间隔时间,但因为时间不好控制就废弃了
[cpp] view plaincopy
1.#include
2.#include
3.#include
4.#include
5.#include
6.#include
7.#include “numMachine.h”
8.#include “serviceWin.h”
9.#include “client.h”
10.#include “constances.h”
11.Client::ClientType createClientType(){ 12.int type;
13.type = rand()% 10 + 1;14.if(type <= 6)
15.return Client::CLIENT_COMMON;16.else if(type >= 7 && type <= 9)17.return Client::CLIENT_FAST;18.return Client::CLIENT_VIP;19.}
20.int createTasktime(){
21.return rand()% MAX_SERVICE_TIME + 1;22.}
23.void createClient(){
24.Client::ClientType clientType;25.int taskTime;
26.for(int i = 0;i < MAX_CLIENT_NUM;++i){ 27.clientType = createClientType();28.taskTime = createTasktime();
29.std::cout << “Come in a client : clientType = ” << clientType 30.<< “ taskTime = ” << taskTime << std::endl;
31.NumMachine::getInstance()->pressMachine(clientType, taskTime);32.sleep(1);33.}
34.sleep(5);35.}
36.void * serviceWin(void *win){
37.ServiceWin *serWin = static_cast
41.bool createServiceWin(){
42.pthread_t commonServiceWin[4];43.pthread_t fastServiceWin;44.pthread_t vipServiceWin;45.char tmp[10];46.ServiceWin *win;
47.for(int i = 0;i < 4;++i){ 48.sprintf(tmp, “CommonWin%d”, i);49.win = new CommonSerWin(tmp);50.if(win == NULL){
51.std::cout << “Create common service win error.” << std::endl;52.return-1;53.}
54.if(pthread_create(&commonServiceWin[i], NULL, serviceWin,(void*)win)
55.!= 0){
56.std::cout << “Create common service thread error.” << std::endl;
57.return false;58.} 59.} 60.sprintf(tmp, “FastWin”);61.win = new FastSerWin(tmp);62.if(win == NULL){
63.std::cout << “Create fast service win error.” << std::endl;64.return false;65.}
66.if(pthread_create(&fastServiceWin, NULL, serviceWin,(void*)win)!= 0){
67.std::cout << “Create fast service thread error.” << std::endl;68.return false;69.}
70.sprintf(tmp, “VipWin”);71.win = new VipSerWin(tmp);72.if(win == NULL){
73.std::cout << “Create vip service win error.” << std::endl;74.return false;75.}
76.if(pthread_create(&fastServiceWin, NULL, serviceWin,(void*)win)!= 0){
77.std::cout << “Create vip service thread error.” << std::endl;78.return false;79.}
80.return true;81.}
82.int main(int argc, char *argv[]){
83.std::cout << “/***start : please wait 5 seconds when progress suspend *****/” << std::endl;
84.srand((unsigned)time(0));85.if(!createServiceWin()){
86.std::cout << “Create service win error.” << std::endl;87.return-1;88.}
89.createClient();
90.delete NumMachine::getInstance();91.}
文件client.cpp client.h 定义了我们的客户,因为我们的客户比较简单,所有的客户共享一个class,只是clientType来区分不同的客户。
[cpp] view plaincopy 1.#ifndef CLIENT_H_
2.#define CLIENT_H_
3.class Client { 4.public:
5.enum ClientType {
6.CLIENT_COMMON, CLIENT_FAST, CLIENT_VIP 7.};
8.Client(ClientType type, int time);9.virtual ~Client();
10.ClientType getClientType();11.int getServiceTime();12.private:
13.ClientType clientType;14.int serviceTime;15.};
16.#endif /* CLIENT_H_ */
[c-sharp] view plaincopy
1.#include “client.h”
2.Client::Client(ClientType type, int time): 3.clientType(type), serviceTime(time){ 4.}
5.Client::~Client(){ 6.}
7.Client::ClientType Client::getClientType(){ 8.return clientType;9.}
10.int Client::getServiceTime(){ 11.return serviceTime;12.}
文件numMachine.cpp numMachine.h 文件中定义了排号机,在numMachine中定义了一个client list用来存放我们的客户。
[cpp] view plaincopy
1.#ifndef NUMMACHINE_H_
2.#define NUMMACHINE_H_
3.#include 4.#include
5.#include
7.#include
8.#include “client.h”
9.#include “constances.h”
10.class NumMachine { 11.public:
12.virtual ~NumMachine();
13.static NumMachine *getInstance();
14.void pressMachine(Client::ClientType clientType, int tasktime);15.Client * removeClient(Client::ClientType val);16.private:
17.NumMachine();
18.static NumMachine *numMachine;19.std::list
22.int handledClient;
23.pthread_mutex_t clientListLock;24.};
25.class DelClientList { 26.public:
27.void operator()(Client * item);28.};
29.class FindClient { 30.public:
31.FindClient(Client::ClientType t);32.bool operator()(Client * item);33.private:
34.Client::ClientType clientType;35.};
36.#endif /* NUMMACHINE_H_ */
[cpp] view plaincopy
1.#include “numMachine.h”
2./***************************************************************************************/
3.NumMachine * NumMachine::numMachine = new NumMachine;4.NumMachine::NumMachine():
5.leaveClient(0), total(0), handledClient(0){ 6.pthread_mutex_init(&clientListLock, NULL);7.} 8.NumMachine::~NumMachine(){
9.std::cout << “/********** end ****************/” << std::endl;
10.std::cout << “The number of total client is ” << total << std::endl;11.std::cout << “The number of handled client is ” << handledClient << std::endl;
12.std::cout << “The number of waiting client is ” << clientList.size()<< std::endl;
13.std::cout << “The number of client is ” << leaveClient 14.<< “ ,because waiting time too long.” << std::endl;15.for_each(clientList.begin(), clientList.end(), DelClientList());16.}
17.NumMachine * NumMachine::getInstance(){ 18.return numMachine;19.}
20.void NumMachine::pressMachine(Client::ClientType clientType, int taskTime){
21.++total;
22.if(clientList.size()< MAX_WAITING_CLIENT_NUM){ 23.Client * c = new Client(clientType, taskTime);24.if(c == NULL){
25.std::cout << “Can't create Client” << std::endl;26.exit(-1);27.}
28.clientList.push_back(c);29.} else {
30.++leaveClient;31.} 32.}
33.Client * NumMachine::removeClient(Client::ClientType val){ 34.std::list
36.pthread_mutex_lock(&clientListLock);
37.pos = find_if(clientList.begin(), clientList.end(), FindClient(val));38.tmp = *pos;
39.if(pos!= clientList.end()){ 40.clientList.erase(pos);41.++handledClient;
42.pthread_mutex_unlock(&clientListLock);43.return tmp;44.} else {
45.pthread_mutex_unlock(&clientListLock);46.return NULL;47.} 48.}
49./***************************************************************************************/
50.void DelClientList::operator()(Client *item){
51.std::cout << “Waiting client : clientType =” << item->getClientType()52.<< “ taskTime = ” << item->getServiceTime()<< std::endl;53.delete item;54.}
55./***************************************************************************************/
56.FindClient::FindClient(Client::ClientType t): 57.clientType(t){ 58.}
59.bool FindClient::operator()(Client * item){ 60.if(item->getClientType()== clientType)61.return true;62.else
63.return false;64.}
文件serviceWin.cpp serviceWin.h 文件中定义了我们窗口。
[cpp] view plaincopy
1.#ifndef SERVICEWIN_H_
2.#define SERVICEWIN_H_
3.#include
4.#include
5.#include “numMachine.h”
6.class ServiceWin { 7.public:
8.ServiceWin(std::string n);9.virtual ~ServiceWin();10.virtual void execute()= 0;11.std::string getWinName();12.private:
13.std::string winName;14.};
15.class CommonSerWin: public ServiceWin { 16.public:
17.CommonSerWin(std::string n);18.virtual ~CommonSerWin();19.virtual void execute();20.};
21.class FastSerWin: public ServiceWin { 22.public:
23.FastSerWin(std::string n);24.virtual ~FastSerWin();25.virtual void execute();26.};
27.class VipSerWin: public ServiceWin { 28.public:
29.VipSerWin(std::string n);30.virtual ~VipSerWin();31.virtual void execute();32.};
33.#endif /* SERVICEWIN_H_ */
[cpp] view plaincopy
1.#include “serviceWin.h”
2./*********************************************************************************************/
3.ServiceWin::ServiceWin(std::string n): 4.winName(n){ 5.}
6.ServiceWin::~ServiceWin(){ 7.}
8.std::string ServiceWin::getWinName(){ 9.return winName;10.}
11./*********************************************************************************************/
12.CommonSerWin::CommonSerWin(std::string n): 13.ServiceWin(n){ 14.}
15.CommonSerWin::~CommonSerWin(){ 16.}
17.void CommonSerWin::execute(){ 18.Client * client = NULL;19.while(1){
20.client = NumMachine::getInstance()->removeClient(Client::CLIENT_COMMON);
21.if(client!= NULL){ 22.std::cout << “A client be handled : clientType = ” << client->getClientType()
23.<< “ taskTime = ” << client->getServiceTime()<< “ ”<< getWinName()<< std::endl;
24.sleep(client->getServiceTime());25.delete client;26.} 27.} 28.}
29./*********************************************************************************************/
30.FastSerWin::FastSerWin(std::string n): 31.ServiceWin(n){ 32.}
33.FastSerWin::~FastSerWin(){ 34.}
35.void FastSerWin::execute(){ 36.Client * client = NULL;37.while(1){
38.client = NumMachine::getInstance()->removeClient(Client::CLIENT_FAST);
39.if(client!= NULL){
40.std::cout << “A client be handled : clientType = ” << client->getClientType()
41.<< “ taskTime = ” << client->getServiceTime()<< “ ”<< getWinName()<< std::endl;
42.sleep(client->getServiceTime());43.delete client;44.} 45.} 46.}
47./*********************************************************************************************/
48.VipSerWin::VipSerWin(std::string n): 49.ServiceWin(n){ 50.}
51.VipSerWin::~VipSerWin(){ 52.}
53.void VipSerWin::execute(){ 54.Client * client = NULL;55.while(1){
56.client = NumMachine::getInstance()->removeClient(Client::CLIENT_VIP);
57.if(client!= NULL){ 58.std::cout << “A client be handled : clientType = ” << client->getClientType()
59.<< “ taskTime = ” << client->getServiceTime()<< “ ”<< getWinName()<< std::endl;
60.sleep(client->getServiceTime());61.delete client;62.} 63.} 64.}
结论:
经过几次测试发现在上述条件下,FAST窗口办理业务不能满足需求,在客户不在来的后5秒内,不能处理完FAST客户。