Реализация диспетчера очереди печати принтера

У нас есть задание, в котором мы должны реализовать диспетчер очереди печати принтера с использованием связанных списков. Я использовал список из STL для реализации всего. Я могу заставить программу отправлять команду печати и поддерживать статус документов. Проблема в том, что я не знаю, как имитировать / отправить фиктивную команду печати, чтобы документ был распечатан. Если я использую Sleep (), будет задержка во всей программе, в то время как я хочу, чтобы печать наотмашь и другие пользователи имели доступ к программе. Любая помощь будет оценена по моей проблеме, спасибо.


person Bhatti7    schedule 15.09.2013    source источник
comment
Итак, что именно вы просите? Как сделать вид, что что-то печатается? чтобы вы могли поставить в очередь несколько заданий и снова увидеть, как они медленно исчезают?   -  person Mats Petersson    schedule 15.09.2013
comment
Нам не обязательно использовать настоящий принтер. Просто тип фиктивной команды, чтобы программа знала напечатанные документы.   -  person Bhatti7    schedule 15.09.2013
comment
@MatsPetersson Да, именно так   -  person Bhatti7    schedule 15.09.2013


Ответы (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 мс.

person Mats Petersson    schedule 15.09.2013