Реализация диспетчера очереди печати
У нас есть задание, в котором мы должны реализовать диспетчер очереди печати, используя связанные списки. Я использовал список из STL, чтобы реализовать все. Я могу заставить программу посылать команду печати и поддерживать статус документов. Проблема в том, что я не знаю, как имитировать / отправить фиктивную команду печати, чтобы документ был напечатан. Если я использую Sleep(), то во всей программе будет задержка. В то же время я хочу, чтобы печать выполнялась с обратной стороны, а другие пользователи имели доступ к программе. Любая помощь будет оценена в отношении моей проблемы, спасибо.
1 ответ
В РЕАЛЬНОМ спулере печати либо есть несколько потоков (либо в Unix, может быть fork
) или система использует подход типа "ждать нескольких объектов", и когда есть что напечатать, часть документа отправляется на принтер, настроенный таким образом, чтобы, когда эта часть "потреблялась", ожидаемый объект "готовы". Затем диспетчер очереди ожидает чего-либо (нового задания или распечатки). Когда ожидание завершено, оно определяет, что произошло. Если это новое задание на печать, поставьте его в очередь, если это "некоторая печать завершена", он проверяет, является ли это последним этапом печати, и завершает ли это задание или отправляет больше материала на принтер.
В псевдокдое это может выглядеть примерно так:
for(;;)
{
what = wait_for_work();
switch (what)
{
case new_job:
add_new_job();
break;
case print_write_done:
if (document_complete)
remove_current_job();
else
send_more_from_current_job();
break;
case spooler_terminate:
exit(0);
default:
print_error_message();
}
}
Очевидно, что, не видя ваш код, трудно сказать, как вы должны его реализовать. Но можно иметь таймер для имитации "документа, печатаемого небольшими порциями", например, 10 КБ расходуется каждые 100 мс, например.