银行窗口排队叫号系统实现

本文介绍了在Windows下使用VS2008开发的一个银行窗口排队叫号调度系统的实现,参考了Java和Linux C++版本。系统包括6个窗口,1-4号为普通窗口,5号为快速窗口,6号为VIP窗口。客户类型按比例异步生成,办理业务时间随机设定。系统处理客户逻辑包括窗口优先级和同步问题。作者提供了关键代码片段和完整程序的下载链接,欢迎讨论和指正。
摘要由CSDN通过智能技术生成

这是一个模拟银行窗口排队叫号调度系统,参考了网上两篇文章,一篇java的和一篇linux c++的,然后我在windows下实现了它,开发工具是vs2008.在文章最后我会给出直接可编译可执行代码。

Java版参考:http://blog.csdn.net/zhangxiaoxiang/article/details/6294132
Linux c++版参考:http://blog.csdn.net/yanjiashang/article/details/6359652

模拟实现银行业务调度系统逻辑,具体需求如下:
• 银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。
• 有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。
• 异步随机生成各种类型的客户,生成各类型用户的概率比例为:
VIP客户:普通客户:快速客户 = 1 :6 :3。
• 客户办理业务所需时间有最大值和最小值,在该范围内随机设定每个VIP客户以及普通客户办理业务所需的时间,快速客户办理业务所需时间为最小值(提示:办理业务的过程可通过线程Sleep的方式模拟)。
• 各类型客户在其对应窗口按顺序依次办理业务。
• 当VIP(6号)窗口和快速业务(5号)窗口没有客户等待办理业务的时候,这两个窗口可以处理普通客户的业务,而一旦有对应的客户等待办理业务的时候,则优先处理对应客户的业务。
• 随机生成客户时间间隔以及业务办理时间最大值和最小值自定,可以设置。
分析,注意一下几点:
1、 其实实现方法还是挺多的,可以用3个队列分别表示vip,fast和commer,也可以只用一个list,直接在里面找,我就只用了一个list。
2、 NumberMachine要设计为单例类。
3、 注意同步与互斥的问题,同时避免死锁。当表为空时,即每人来的的时候,线程应该在等待资源,而不是一直在循环。最后假设银行一天最多只能处理50个人最为终结条件。

代码关键的地方有加点注释,我觉得不需要解释还是可以看懂了,那就直接上代码吧,文章最后会把完整程序一并给出。同时,需要看到程序有什么不妥的地方请指出,互相探讨,共同进步。

Bank_queue.cpp

#include "stdafx.h"

#include <iostream>  
#include <process.h>

#include <stdio.h>  
#include <stdlib.h>  
#include <time.h>  
#include "numMachine.h"  
#include "serviceWin.h"  
#include "client.h"  
#include "constances.h"  
using namespace std;

HANDLE thread1[4];
HANDLE thread2;
HANDLE thread3;
map<int,HANDLE> thread_Map;
enum ID{
    THREAD1_0,THREAD1_1,THREAD1_2,THREAD1_3,THREAD2,THREAD3
};

Client::ClientType createClientType() {  
    int type;  
    type = rand() % 10 + 1;  
    if (type <= 6)  
        return Client::CLIENT_COMMON;  
    else if (type >= 7 && type <= 9)  
        return Client::CLIENT_FAST;  
    return Client::CLIENT_VIP;  
}  
int createTasktime() {  
    return rand() % MAX_SERVICE_TIME + 1;  
}  
void createClient() {  
    Client::ClientType clientType;  
    int taskTime;  
    for (int i = 0; i < MAX_CLIENT_NUM; ++i) {  
        clientType = createClientType();  
        taskTime = createTasktime();  
        std::cout << "Come in a client : clientType = " << clientType  
            << " taskTime = " << taskTime << std::endl;  
        NumMachine::getInstance()->pressMachine(clientType, taskTime);  
        Sleep(1);

    }  
}  
unsigned  __stdcall serviceWin(void *win) {  
    ServiceWin *serWin = static_cast<ServiceWin*> (win);    
    serWin->execute(); 
    TerminateThread(thread_Map[serWin->getCount()],0);
    return 0;
}  
bool createServiceWin(HANDLE thread1[],HANDLE &thread2,HANDLE &thread3) {    
    unsigned commonServiceWin[4];  
    unsigned fastServiceWin;  
    unsigned vipServiceWin;  

    char tmp[20]={
  0};  
    ServiceWin *win;  
    for (int i = 0; i < 
  • 5
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值