我编写了一个打印队列算法,该算法生成具有随机页数的打印作业,将打印作业插入优先级队列然后打印它们。该程序模拟具有1,2,3和4打印机的系统的打印时间。打印作业每30秒生成一次,打印作业以7页/分钟的速度打印。
我的程序存在的问题是,只有在第一个打印完成后才会创建新的打印作业,而不是每隔30秒继续生成新的作业,而之前的作业以7页/分钟的速度打印。我有时间模拟循环,每秒递增一次,但似乎没有像它应该控制时间。 如何同时控制两个功能的时间,以便在打印机打印时不会停止生成打印作业?
这是我的功能,每隔30秒创建一次打印作业:
void PrinterSim::startSimulation(int jobs, int printers)
{
totalJobs = jobs; // total number of print jobs to generate
numPrinters = printers;
int tick = 1,
jobInterval = 30; // generate new print job every 30 sec.
for (int i = 0; i < totalJobs; i++)
{
int time = 0;
while (time < jobInterval)
time += tick;
if (printers == 1)
{
// create new print job and insert into print queue
// and into a vector storing jobs in the order they arrived
PrintJob* newJob;
newJob = new PrintJob;
myQueue.setOrderReceived(newJob);
myQueue.insertPrintQ(newJob);
}
else
{
// simulate same set of print jobs so get print job
// from vector containing print jobs in order they arrived
PrintJob* job = myQueue.getOrderReceived(i);
myQueue.insertPrintQ(job);
}
// run simulation calls printerManager function
runSimulation();
}
}
这是检查打印机状态并将打印作业发送到下一个可用打印机的功能:
void PrintQueue::printerManager(int printers)
{
while (!printQueue.empty())
{
// check status of each printer
if (printer1.printerAvail())
{
printer1.startPrint(printQueue.top());
orderPrinted.push_back(printQueue.top());
printQueue.pop();
}
// simulation running with 2 or more printers
// make use of multiple printers while first one
// is busy
else if (printer2.printerAvail() && printers > 1)
{
printer2.startPrint(printQueue.top());
orderPrinted.push_back(printQueue.top());
printQueue.pop();
}
else if (printer3.printerAvail() && printers > 2)
{
printer3.startPrint(printQueue.top());
orderPrinted.push_back(printQueue.top());
printQueue.pop();
}
else if (printer4.printerAvail() && printers == 4)
{
printer4.startPrint(printQueue.top());
orderPrinted.push_back(printQueue.top());
printQueue.pop();
}
}
}
这是以7页/分钟的速度打印打印作业的功能:
void Printer::startPrint(PrintJob* current)
{
int pages = current->getNumPages();
// print rate in seconds, soit's the same rate as creating print jobs
double printTime = (pages / PRINT_RATE) * 60;
int time = 0;
int tick = 1;
while (time < printTime)
{
time += tick;
isFree = false; // printer is busy
}
totalTime += printTime / 60;
isFree = true;
}
以下是查看完整计划的链接:https://onlinegdb.com/ryhudLDbz
示例输入:4(生成4个打印作业) 样本预期输出: 打印任务按此顺序到达: 87页 78页 16页 23页
打印任务按以下顺序打印: 87页 16页 23页 78页
打印任务应按照从最小到最大的顺序打印。