一种基于Linux智能排队系统的设计与实现*
2013-01-10李金友
李金友,杨 林,齐 颖
(通化师范学院 计算机学院,吉林 通化 134001)
智能排队系统又称排队机(Queue Management System)、叫号机、排号机、号票机、发号机、取号机,在一些银行、服务大厅、医院等场所随处可见.在国外排队系统已有多年的历史,被广泛用于需要排队等候的各个领域;在我国排队系统的出现时间较短,但得到了快速发展.早期排队系统以单片机为主,近些年来随着电子市场的发展,逐渐被完整的计算机系统所替代.
1 智能排队系统工作原理
智能排队系统主要分服务器和叫号终端两部分,它的工作原理主要由以下三个方面构成:一是服务器端.它根据用户办理的业务选择对应的服务,从取号打印机打印服务序号,票号上有相应的服务类型、排队序号、当前现有等待人数、时间等信息,然后到相应的客户等待休息区等待.二是叫号终端.即每个服务窗口配有一个排号叫号终端,分别通过网络与排队服务器连接,多个窗口的排号叫号终端通过网络连接到排队主机服务器.三是智能分号显示屏.当服务窗口的工作人员开始服务时,通过叫号终端发送呼叫请求,排队服务主机回应呼叫终端的呼叫信息,并根据结果处理队列,响应客户端请求,给叫号终端屏分配服务号,并语音给出语音提示:“请XX号顾客到XX号窗口”,用户根据语音提示和显示屏信息到相应的窗口办理业务.具体原理图如图1所示.
图1 智能排队系统原理图
2 系统分析
一个排队系统包括六要素:
(1)客户到达过程:耐心客户/非耐心客户、客户到达时间间隔可以看作一个随机变量、用一个随机过程描述客户到达模式、平稳/非平稳到达模式.
(2)服务过程:状态无关/状态相关、服务时间可看作一个随机变量、平稳/非平稳服务时间.
(3)服务器数量:单个/多个服务器、多服务器多队列或多服务器单队列.
(4)系统容量:客户部能立即获得服务时选择等待/离开、有限/无限个等待位.
(5)顾客源数量:有限/无限.
(6)排队规则:优先级、抢占优先/非抢占优先.
3 系统功能改进
与传统的排队系统相比较,主要改进了以下两个方面的内容:
第一,实现过号加号功能.常见的排队系统中,有的客户由于诸多原因错过叫号时间,只能再进行叫号等待.文中所设计的系统在对待此类问题实现了加号功能,对错过的客户按一定的时间阀值,系统自动加入到排队队列中,时间的阀值可以根据需要进行设置,错过的客户,不用再进行叫号,在客户端屏幕会显示错过用户的加号顺序,按提示进行等待即可.
第二,实现叫号无纸打号排队功能.常见的排队系统中,实现打印小票凭票排队功能.全国统计下来,一年要浪费许多纸张,将是很大的浪费,不符合现在的环保要求.该系统对该功能进行了改进,不打印小票,客户可以根据屏幕显示号码等待排序,为了防止错误,可以对每个客户系统自动进行拍照,工作人员可以根据LED屏幕上用户照片判断是否是该号码客户.
4 系统实现
软件系统设计主要分为服务器、叫号终端两个主要部分,每个部分均包含根据事先约定的通信协议设计的通信软件,系统使用的是先来先服务排队规则.
(1)服务器端代码实现.linuxC++多线程设计是基于Linux系统下的多线程程序设计,包括多个任务程序的设计,并发程序的设计,网络程序的设计等.LinuxC++系统下的多线程遵循POSIX线程接口,通常称为pthread.编写LinuxC++下的多线程程序时,需要使用头系统提供的文件pthread.h,连接时需要使用系统库libpthread.a.
服务器核心部分代码simpleServer.c如下:
void *thread(void *arg){
int i= 0;
int j=1000;
int k=3000;
char buf[2];
char buf1[5];
int ret=0;
int m=0;
int a;
int clientfd=*(int*)arg;
InitQueue(&Vip);
InitQueue(&Normal);
InitQueue(&Other);
while(1){
ret=read(clientfd,buf,sizeof(buf)-1);
if(ret<=0)
return;
if(strcmp(buf,"0")==0){
i=i+1;if(i==1000){
i=1;
}m=i;
EnQueue(&Vip,i);
PrintQueue(&Vip);
}
if(strcmp(buf,"1")==0){
j++;
if(j==3000){
j=1001;
}
m=j;
EnQueue(&Normal,j);
}
if(strcmp(buf,"2")==0){
k++;
if(k==5000){
k=3001;
}
m=k;
EnQueue(&Other,k);
}
if(strcmp(buf,"V")==0){
DeQueue(&Vip,&m);
}
if(strcmp(buf,"N")==0){
DeQueue(&Normal,&m);
}
if(strcmp(buf,"O")==0){
DeQueue(&Other,&m);
}bzero(buf1,sizeof(buf1));
sprintf(buf1,"%d",m);
write(clientfd,buf1,strlen(buf1));
}
(2)客户端核心部分代码:
void myqueue::cash_button(){
char buf[1000];
bzero(buf,sizeof(buf));
write(fd,"0",1);
read(fd,buf,sizeof(buf)-1);/*确定协议*/
printf("%s ",buf);
QString tmp;
QString string(buf);
tmp="您的现金业务号码为"+string+"位顾客请到休息区等待";
showlabel->setText(tmp);
}
5 结语
本文基于Linux智能排队系统排队的若干问题的讨论,主要是针对项目整体设计进行说明,确定系统服务器和客户端的设计与实现方法,并对各个模块的软件设计与实现进行了较为完整的概括,在一些类似的技术应用上都有借鉴性.
参考文献:
[1]王策,张连芳,董淼,等.基于Linux的嵌入式系统开发[J].计算机应用,2002(7).
[2]黄卓君.解决银行排队难题的根本出路何在[J].南方金融,2007(7).
[3]王庆瑞.数据结构教程[M].北京:希望电子出版社,2002.
[4]赵祖龙.基于Qt/Embedded的嵌入式跨平台聊天系统设计[J].信息技术,2010(12).