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