Практическое руководство. Определение возможности печати в заданное время суток

Практическое руководство. Определение возможности печати в заданное время суток

Очереди печати не всегда доступны в течение суток. У них имеются свойства для времени начала и окончания, которые можно настраивать, чтобы сделать эти очереди недоступными в определенное время суток. Эту функцию можно использовать, например, с целью резервирования принтера после 17 часов для исключительного использования определенным отделом. У этого отдела будет другая, отличная от других отделов очередь обслуживания принтера. Очередь для других отделов будет недоступна после 17 часов, в то время как очередь для отдела, наделенного соответствующими преимуществами, может быть доступна в любое время.

Кроме того, сами задания печати могут настраиваться так, чтобы они выполнялись только в течение указанного промежутка времени.

Классы PrintQueue и PrintSystemJobInfo, предоставляемые в API-интерфейсах платформы Microsoft .NET Framework, выступают как средства для удаленной проверки возможности выполнения определенного печатного задания из определенной очереди в текущее время.

Пример

Ниже приводится пример, демонстрирующий, как можно диагностировать проблемы с заданием печати.

Для реализации этой функции существует два следующих основных шага.

Чтение свойств StartTimeOfDay и UntilTimeOfDay из класса PrintQueue для выяснения того, что текущее время находится между значениями, определяемыми этим свойствами.

Чтение свойств StartTimeOfDay и UntilTimeOfDay из класса PrintSystemJobInfo для выяснения того, что текущее время находится между значениями, определяемыми этим свойствами.

Сложности возникают из-за того, что эти свойства не являются объектами DateTime. Вместо этого они являются объектами Int32, выражающими количество минут, прошедшее с полуночи. Кроме того, это не полночь текущего часового пояса, а полночь по времени в формате UTC (универсальное координированное время).

В первом примере кода представлен статический метод ReportQueueAndJobAvailability, которому передается класс PrintSystemJobInfo, и вызываются вспомогательные методы для выяснения возможности выполнения задания печати в текущее время, при отсутствии такой возможности, определяется, когда печать может быть выполнена. Обратите внимание, что класс PrintQueue не передается этому методу. Это обусловлено тем, что в классе PrintSystemJobInfo имеется ссылка на очередь, реализуемая посредством свойства HostingPrintQueue.

Подчиненные методы включают в себя перегруженный метод ReportAvailabilityAtThisTime, который может принимать PrintQueue или PrintSystemJobInfo в качестве параметра. Также существует метод TimeConverter.ConvertToLocalHumanReadableTime. Все эти методы рассматриваются ниже.

Сначала в методе ReportQueueAndJobAvailability проверяется одновременная недоступность очереди или задания печати в текущее время. При недоступности какого-либо из этих двух факторов проверяется недоступность очереди. Если очередь недоступна, тогда метод передает информацию об этом, а также время, когда очередь снова станет доступной. Затем проверяется задание, и если оно не доступно, сообщается следующий промежуток времени, когда печать будет возможна. Наконец, метод сообщает самое раннее время, когда возможен вывод задания на печать. Это самое позднее из двух следующих значений времени.

Время, когда очередь печати будет доступна следующий раз.

Время, когда печатное задание будет доступно следующий раз.

При сообщении времени также вызывается метод ToShortTimeString, так как этот метод удаляет из вывода информацию о годах, месяцах и днях. Ограничение доступности очереди печати или задания печати по годам, месяцам или дням невозможно.

Два варианта перегрузки метода ReportAvailabilityAtThisTime идентичны, за исключением передаваемого им типа, поэтому ниже представлена только версия сPrintQueue.

При учете идентичности указанных методов за исключением типа может возникнуть вопрос о том, почему в примере не создается универсальный метод ReportAvailabilityAtThisTime<T>. Причина этого заключается в том, что такой метод должен быть ограничен классом со свойствами StartTimeOfDay и UntilTimeOfDay, которые вызываются методом, но универсальный метод может быть ограничен только одним классом, и единственным классом, общим для классов PrintQueue и PrintSystemJobInfo в дереве наследования, является класс PrintSystemObject, у которого нет таких свойств.

Сначала в методе ReportAvailabilityAtThisTime (представленном в примере кода ниже) выполняется инициализация контрольной переменной типа Boolean со значением true . Если очередь недоступна, этой переменной присваивается значение false .

Далее метод проверяет, не совпадают ли начальное и конечное значение времени. Если они совпадают, то очередь всегда доступна, поэтому метод возвращает значение true .

Если очередь недоступна все время, метод использует статическое свойство UtcNow для получения текущего времени в качестве объекта DateTime. (Нам не требуется местное время, так как свойства StartTimeOfDay и UntilTimeOfDay используются в формате UTC.)

Однако эти два свойства не являются объектами DateTime. Они являются величинами Int32, выражающими количество минут, прошедшее после полуночи по времени в формате UTC. Поэтому нам нужно преобразовать объект DateTime в величину, соответствующую количеству минут, прошедших после полуночи. После этого метод просто проверяет, находится ли текущее время между начальным и конечным временем для очереди, задает для контрольной переменной значение «false», если текущее время не находится в интервале между двумя указанными значениями времени, и возвращает значение контрольной переменной.

📎📎📎📎📎📎📎📎📎📎