1、 c+版模拟银行窗口排队叫号系统c+版模拟银行窗口排队叫号系统 看了两位 LZ 的银行排队系统 blog,感觉不错,就也产生了用 C+写个排号系统,原因有二,1、对 Java 不太熟悉,没有看太懂。2、练练手。3 、提高一下 C+的人气。进入主题:对于这一块的业务系统需求没有做过多的分析,只在两位 LZ 的基础做了小小的改动,然后用 C+实现。题目:模拟实现银行业务调度系统逻辑,具体需求如下:银行内有 6 个业务窗口,1 - 4 号窗口为普通窗口,5 号窗口为快速窗口,6 号窗口为VIP 窗口。有三种对应类型的客户:VIP 客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。异步
2、随机生成各种类型的客户,生成各类型用户的概率比例为:VIP 客户:普通客户:快速客户 = 1 :6 :3。客户办理业务所需时间有最大值和最小值,在该范围内随机设定每个 VIP 客户以及普通客户办理业务所需的时间,快速客户办理业务所需时间为最小值(提示:办理业务的过程可通过线程 Sleep 的方式模拟)。各类型客户在其对应窗口按顺序依次办理业务。当 VIP(6 号)窗口和快速业务(5 号)窗口没有客户等待办理业务的时候,这两个窗口可以处理普通客户的业务,而一旦有对应的客户等待办理业务的时候,则优先处理对应客户的业务。随机生成客户时间间隔以及业务办理时间最大值和最小值自定,可以设置。不要求实现 G
3、UI,只考虑系统逻辑实现,可通过 Log 方式展现程序运行结果。修改:1、在这里为了简化程序的设计(只省了只行代码),FAST 和 VIP 窗口只办理对应的客户,不办普通客户的业务。2、由于对于客户的到来,也采用 1S 来一个的做法,但因为在 console 程序对于时间不太好控制,在这里只是设定了客户数,即每个 1 秒来一个客户,根据来的客户数控制时间。开发环境:Linux代码:文件 constances.h该文件中定义了一些常量,其中 MAX_WAITING_CLIENT_NUM 指的是,最多正在等待的客户数,如果客户数到达最大,后来的客户将会离开。cpp view plaincopy1.
4、 #ifndef CONSTANCES_H_ 2. #define CONSTANCES_H_ 3. enum 4. MAX_SERVICE_TIME = 10, 5. MIN_SERVICE_TIME = 1, 6. CLIENT_INTERVAL_TIME = 1, 7. MAX_WAITING_CLIENT_NUM = 50, 8. MAX_CLIENT_NUM = 100, 9. ; 10. #endif /* CONSTANCES_H_ */ 文件 main.cpp1、每一个窗口对应一个线程,在此创建了 6 个线程,分别对应 4 个客户窗口,1 个 FAST窗口中,1 个 VIP 窗
5、口中。2、在这里本想用 Unix 中的 alarm 信号来控制客户的间隔时间,但因为时间不好控制就废弃了cpp view plaincopy1. #include 2. #include 3. #include 4. #include 5. #include 6. #include 7. #include “numMachine.h“ 8. #include “serviceWin.h“ 9. #include “client.h“ 10. #include “constances.h“ 11. Client:ClientType createClientType() 12. int type
6、; 13. type = rand() % 10 + 1; 14. if (type = 7 32. sleep(1); 33. 34. sleep(5); 35. 36. void * serviceWin(void *win) 37. ServiceWin *serWin = static_cast (win); 38. serWin-execute(); 39. return (void *) 0); 40. 41. bool createServiceWin() 42. pthread_t commonServiceWin4; 43. pthread_t fastServiceWin;
7、 44. pthread_t vipServiceWin; 45. char tmp10; 46. ServiceWin *win; 47. for (int i = 0; i 4. #include 5. #include 6. #include 7. #include 8. #include “client.h“ 9. #include “constances.h“ 10. class NumMachine 11. public: 12. virtual NumMachine(); 13. static NumMachine *getInstance(); 14. void pressMa
8、chine(Client:ClientType clientType, int tasktime); 15. Client * removeClient(Client:ClientType val); 16. private: 17. NumMachine(); 18. static NumMachine *numMachine; 19. std:list clientList; 20. int leaveClient; 21. int total; 22. int handledClient; 23. pthread_mutex_t clientListLock; 24. ; 25. cla
9、ss DelClientList 26. public: 27. void operator () (Client * item); 28. ; 29. class FindClient 30. public: 31. FindClient(Client:ClientType t); 32. bool operator () (Client * item); 33. private: 34. Client:ClientType clientType; 35. ; 36. #endif /* NUMMACHINE_H_ */ cpp view plaincopy1. #include “numM
10、achine.h“ 2. /*/ 3. NumMachine * NumMachine:numMachine = new NumMachine; 4. NumMachine:NumMachine() : 5. leaveClient(0), total(0), handledClient(0) 6. pthread_mutex_init( 7. 8. NumMachine:NumMachine() 9. std:cout :iterator pos; 35. Client *tmp; 36. pthread_mutex_lock( 37. pos = find_if(clientList.be
11、gin(), clientList.end(), FindClient(val); 38. tmp = *pos; 39. if (pos != clientList.end() 40. clientList.erase(pos); 41. +handledClient; 42. pthread_mutex_unlock( 43. return tmp; 44. else 45. pthread_mutex_unlock( 46. return NULL; 47. 48. 49. /*/ 50. void DelClientList:operator ()(Client *item) 51.
12、std:cout getClientType() 52. getServiceTime() getClientType() = clientType) 61. return true; 62. else 63. return false; 64. 文件 serviceWin.cpp serviceWin.h文件中定义了我们窗口。cpp view plaincopy1. #ifndef SERVICEWIN_H_ 2. #define SERVICEWIN_H_ 3. #include 4. #include 5. #include “numMachine.h“ 6. class Service
13、Win 7. public: 8. ServiceWin(std:string n); 9. virtual ServiceWin(); 10. virtual void execute() = 0; 11. std:string getWinName(); 12. private: 13. std:string winName; 14. ; 15. class CommonSerWin: public ServiceWin 16. public: 17. CommonSerWin(std:string n); 18. virtual CommonSerWin(); 19. virtual v
14、oid execute(); 20. ; 21. class FastSerWin: public ServiceWin 22. public: 23. FastSerWin(std:string n); 24. virtual FastSerWin(); 25. virtual void execute(); 26. ; 27. class VipSerWin: public ServiceWin 28. public: 29. VipSerWin(std:string n); 30. virtual VipSerWin(); 31. virtual void execute(); 32.
15、; 33. #endif /* SERVICEWIN_H_ */ cpp view plaincopy1. #include “serviceWin.h“ 2. /*/ 3. ServiceWin:ServiceWin(std:string n) : 4. winName(n) 5. 6. ServiceWin:ServiceWin() 7. 8. std:string ServiceWin:getWinName() 9. return winName; 10. 11. /*/ 12. CommonSerWin:CommonSerWin(std:string n) : 13. ServiceW
16、in(n) 14. 15. CommonSerWin:CommonSerWin() 16. 17. void CommonSerWin:execute() 18. Client * client = NULL; 19. while (1) 20. client = NumMachine:getInstance()-removeClient(Client:CLIENT_COMMON); 21. if (client != NULL) 22. std:cout getClientType() 23. getServiceTime() getServiceTime(); 25. delete cli
17、ent; 26. 27. 28. 29. /*/ 30. FastSerWin:FastSerWin(std:string n) : 31. ServiceWin(n) 32. 33. FastSerWin:FastSerWin() 34. 35. void FastSerWin:execute() 36. Client * client = NULL; 37. while (1) 38. client = NumMachine:getInstance()-removeClient(Client:CLIENT_FAST); 39. if (client != NULL) 40. std:cou
18、t getClientType() 41. getServiceTime() getServiceTime(); 43. delete client; 44. 45. 46. 47. /*/ 48. VipSerWin:VipSerWin(std:string n) : 49. ServiceWin(n) 50. 51. VipSerWin:VipSerWin() 52. 53. void VipSerWin:execute() 54. Client * client = NULL; 55. while (1) 56. client = NumMachine:getInstance()-removeClient(Client:CLIENT_VIP); 57. if (client != NULL) 58. std:cout getClientType() 59. getServiceTime() getServiceTime(); 61. delete client; 62. 63. 64. 结论:经过几次测试发现在上述条件下,FAST 窗口办理业务不能满足需求,在客户不在来的后5 秒内,不能处理完 FAST 客户。