一种基于Linux智能排队系统的设计与实现*

2013-01-10 10:15李金友
通化师范学院学报 2013年4期
关键词:队列排队客户端

李金友,杨 林,齐 颖

(通化师范学院 计算机学院,吉林 通化 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).

猜你喜欢
队列排队客户端
怎样排队
队列里的小秘密
基于多队列切换的SDN拥塞控制*
如何看待传统媒体新闻客户端的“断舍离”?
在队列里
巧排队列
三角龙排队
县级台在突发事件报道中如何应用手机客户端
孵化垂直频道:新闻客户端新策略
大枢纽 云平台 客户端——中央人民广播电台的探索之路