李金友,楊 林,齊 穎
(通化師范學院 計算機學院,吉林 通化 134001)
智能排隊系統(tǒng)又稱排隊機(Queue Management System)、叫號機、排號機、號票機、發(fā)號機、取號機,在一些銀行、服務大廳、醫(yī)院等場所隨處可見.在國外排隊系統(tǒng)已有多年的歷史,被廣泛用于需要排隊等候的各個領域;在我國排隊系統(tǒng)的出現(xiàn)時間較短,但得到了快速發(fā)展.早期排隊系統(tǒng)以單片機為主,近些年來隨著電子市場的發(fā)展,逐漸被完整的計算機系統(tǒng)所替代.
智能排隊系統(tǒng)主要分服務器和叫號終端兩部分,它的工作原理主要由以下三個方面構成:一是服務器端.它根據(jù)用戶辦理的業(yè)務選擇對應的服務,從取號打印機打印服務序號,票號上有相應的服務類型、排隊序號、當前現(xiàn)有等待人數(shù)、時間等信息,然后到相應的客戶等待休息區(qū)等待.二是叫號終端.即每個服務窗口配有一個排號叫號終端,分別通過網(wǎng)絡與排隊服務器連接,多個窗口的排號叫號終端通過網(wǎng)絡連接到排隊主機服務器.三是智能分號顯示屏.當服務窗口的工作人員開始服務時,通過叫號終端發(fā)送呼叫請求,排隊服務主機回應呼叫終端的呼叫信息,并根據(jù)結果處理隊列,響應客戶端請求,給叫號終端屏分配服務號,并語音給出語音提示:“請XX號顧客到XX號窗口”,用戶根據(jù)語音提示和顯示屏信息到相應的窗口辦理業(yè)務.具體原理圖如圖1所示.
圖1 智能排隊系統(tǒng)原理圖
一個排隊系統(tǒng)包括六要素:
(1)客戶到達過程:耐心客戶/非耐心客戶、客戶到達時間間隔可以看作一個隨機變量、用一個隨機過程描述客戶到達模式、平穩(wěn)/非平穩(wěn)到達模式.
(2)服務過程:狀態(tài)無關/狀態(tài)相關、服務時間可看作一個隨機變量、平穩(wěn)/非平穩(wěn)服務時間.
(3)服務器數(shù)量:單個/多個服務器、多服務器多隊列或多服務器單隊列.
(4)系統(tǒng)容量:客戶部能立即獲得服務時選擇等待/離開、有限/無限個等待位.
(5)顧客源數(shù)量:有限/無限.
(6)排隊規(guī)則:優(yōu)先級、搶占優(yōu)先/非搶占優(yōu)先.
與傳統(tǒng)的排隊系統(tǒng)相比較,主要改進了以下兩個方面的內(nèi)容:
第一,實現(xiàn)過號加號功能.常見的排隊系統(tǒng)中,有的客戶由于諸多原因錯過叫號時間,只能再進行叫號等待.文中所設計的系統(tǒng)在對待此類問題實現(xiàn)了加號功能,對錯過的客戶按一定的時間閥值,系統(tǒng)自動加入到排隊隊列中,時間的閥值可以根據(jù)需要進行設置,錯過的客戶,不用再進行叫號,在客戶端屏幕會顯示錯過用戶的加號順序,按提示進行等待即可.
第二,實現(xiàn)叫號無紙打號排隊功能.常見的排隊系統(tǒng)中,實現(xiàn)打印小票憑票排隊功能.全國統(tǒng)計下來,一年要浪費許多紙張,將是很大的浪費,不符合現(xiàn)在的環(huán)保要求.該系統(tǒng)對該功能進行了改進,不打印小票,客戶可以根據(jù)屏幕顯示號碼等待排序,為了防止錯誤,可以對每個客戶系統(tǒng)自動進行拍照,工作人員可以根據(jù)LED屏幕上用戶照片判斷是否是該號碼客戶.
軟件系統(tǒng)設計主要分為服務器、叫號終端兩個主要部分,每個部分均包含根據(jù)事先約定的通信協(xié)議設計的通信軟件,系統(tǒng)使用的是先來先服務排隊規(guī)則.
(1)服務器端代碼實現(xiàn).linuxC++多線程設計是基于Linux系統(tǒng)下的多線程程序設計,包括多個任務程序的設計,并發(fā)程序的設計,網(wǎng)絡程序的設計等.LinuxC++系統(tǒng)下的多線程遵循POSIX線程接口,通常稱為pthread.編寫LinuxC++下的多線程程序時,需要使用頭系統(tǒng)提供的文件pthread.h,連接時需要使用系統(tǒng)庫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);/*確定協(xié)議*/
printf("%s ",buf);
QString tmp;
QString string(buf);
tmp="您的現(xiàn)金業(yè)務號碼為"+string+"位顧客請到休息區(qū)等待";
showlabel->setText(tmp);
}
本文基于Linux智能排隊系統(tǒng)排隊的若干問題的討論,主要是針對項目整體設計進行說明,確定系統(tǒng)服務器和客戶端的設計與實現(xiàn)方法,并對各個模塊的軟件設計與實現(xiàn)進行了較為完整的概括,在一些類似的技術應用上都有借鑒性.
參考文獻:
[1]王策,張連芳,董淼,等.基于Linux的嵌入式系統(tǒng)開發(fā)[J].計算機應用,2002(7).
[2]黃卓君.解決銀行排隊難題的根本出路何在[J].南方金融,2007(7).
[3]王慶瑞.數(shù)據(jù)結構教程[M].北京:希望電子出版社,2002.
[4]趙祖龍.基于Qt/Embedded的嵌入式跨平臺聊天系統(tǒng)設計[J].信息技術,2010(12).