我想为银行队列创建一个c ++程序。每3分钟新客户进入队列。每个客户需要5分钟的服务时间。该程序在前30分钟后打印出信息
我写了当前的代码:
#include <queue>
#include <ctime>
#include <time.h>
#include <conio.h>
#include <windows.h>
#include <iostream>
using namespace std;
int main()
{
queue <int> inq;
queue <int> inservice;
int z= 1;
for(int i=0; i<=9; i++)
{
inq.push(z);
Sleep(180000);
_strtime_s(hold_time);
cout<<"Time of arriving for customer number "<<z<<" is: "<<hold_time<<endl;
z++;
}
do
{
inservice.push(inq.front());
Sleep(300000);
_strtime_s(hold_time);
cout<<"Time of leaving for customer number "<<z<<" is: "<<hold_time<<endl;
inq.pop();
}
while(!inq.empty());
cout<<"number of customers waiting : "<<inq.size()<<endl;
cout<<"Customer number "<<inservice.front()<< " is currently serving"<<endl;
return 0;
}
当前代码逐行执行;在队列循环完成之前,客户不会被移动到服务。 为了调整时间,我必须同时运行两个循环。这样客户在服务其他客户的同时进入队列
有什么建议吗?
答案 0 :(得分:1)
要同时运行两个循环,您需要将它们放在不同的线程中。也许开始here来理解线程。
如果您想要银行排队模拟器,可以考虑使用SimPy在Python中实现它。银行队列甚至是其中一个例子: SimPy Bank Example
答案 1 :(得分:1)
您需要更复杂的代码架构。天真线程或事件调度框架在main
中有一个忙循环并且定期(基于定时器和事件)根据需要调用其他函数。
你可以做的最基本但最强大的解决方案是让一个循环非常快速地迭代(使用非常小的sleep
),反复检查时间以查看是否是时间执行任何操作。这些行动将包括抵达的客户和客户离开。
在其他任何环境中使用sleep
,IMO,通常是糟糕设计的标志。
答案 2 :(得分:1)
一种处理这种方法的复杂方法确实会使用线程,但如果你不想这样做,你应该反过来循环,即
for (int minutes = 1; mintues <= 30; minutes++) {
// if minutes modulo 3 do something
// if minutes modulo 5 do something
}
你可以循环秒,微秒,等等。