Postupy: Zjištění, jestli lze tiskovou úlohu vytisknout v tuto denní dobu
Tiskové fronty nejsou vždy k dispozici po dobu 24 hodin denně. Mají vlastnosti počátečního a koncového času, které je možné nastavit tak, aby byly v určitých denních časech nedostupné. Tuto funkci lze použít například k rezervaci tiskárny pro výhradní použití určitého oddělení po 5:00. Toto oddělení by mělo jinou frontu pro obsluhu tiskárny než ostatní oddělení. Fronta pro ostatní oddělení by byla nastavena tak, aby byla po 5:00 nedostupná, zatímco fronta pro upřednostněné oddělení by mohla být nastavena tak, aby byla dostupná vždy.
Tiskové úlohy lze navíc nastavit tak, aby se tiskly pouze v zadaném časovém intervalu.
Třídy PrintQueue a PrintSystemJobInfo vystavené v API Microsoft .NET Framework umožňují vzdáleně zkontrolovat, zda se daná tisková úloha může momentálně tisknout na dané frontě.
Příklad
Následující příklad je ukázka, která dokáže diagnostikovat problémy s tiskovou úlohou.
Pro tento druh funkce existují dva hlavní kroky následujícím způsobem.
Přečtěte si vlastnosti StartTimeOfDay a UntilTimeOfDayPrintQueue a určete, zda aktuální čas spadá mezi ně.
Přečtěte si vlastnosti StartTimeOfDay a UntilTimeOfDay objektu PrintSystemJobInfo a určete, zda aktuální čas spadá mezi ně.
Ale komplikace vznikají ze skutečnosti, že tyto vlastnosti nejsou DateTime objekty. Místo toho jsou Int32 objekty, které vyjadřují denní čas jako počet minut od půlnoci. Kromě toho to není půlnoc v aktuálním časovém pásmu, ale půlnoc UTC (Koordinovaný univerzální čas).
První příklad kódu představuje statickou metodu ReportQueueAndJobAvailability, která přijímá parametr PrintSystemJobInfo a volá pomocné metody k určení, zda se úloha může vytisknout v aktuálním čase, a pokud ne, kdy může být vytištěna. Všimněte si, že PrintQueue nebylo metodě předáno. Důvodem je to, že PrintSystemJobInfo obsahuje odkaz na frontu ve své HostingPrintQueue vlastnosti.
Podřízené metody zahrnují přetíženou metodu ReportAvailabilityAtThisTime, která může jako parametr použít PrintQueue nebo PrintSystemJobInfo. K dispozici je také TimeConverter.ConvertToLocalHumanReadableTime. Všechny tyto metody jsou popsány níže.
Metoda ReportQueueAndJobAvailability začíná kontrolou, zda není v tuto chvíli k dispozici fronta nebo tisková úloha. Pokud některý z nich není dostupný, zkontroluje, jestli je fronta nedostupná. Pokud není k dispozici, metoda oznámí tuto skutečnost a čas, kdy bude fronta znovu dostupná. Poté zkontroluje úlohu a pokud není k dispozici, nahlásí další časový úsek, kdy bude možné tisknout. Nakonec metoda hlásí nejbližší čas, kdy se úloha může vytisknout. To je pozdější z následujících dvou časů.
Čas, kdy bude tisková fronta nejdříve k dispozici.
Čas, kdy bude tisková úloha příště k dispozici.
Při oznamování časů během dne se také nazývá metoda ToShortTimeString, protože tato metoda potlačuje z výstupu roky, měsíce a dny. Dostupnost tiskové fronty nebo tiskové úlohy nemůžete omezit na konkrétní roky, měsíce nebo dny.
static void ReportQueueAndJobAvailability (PrintSystemJobInfo^ theJob)
{
if (!(ReportAvailabilityAtThisTime(theJob->HostingPrintQueue) && ReportAvailabilityAtThisTime(theJob)))
{
if (!ReportAvailabilityAtThisTime(theJob->HostingPrintQueue))
{
Console::WriteLine("\nThat queue is not available at this time of day." + "\nJobs in the queue will start printing again at {0}", TimeConverter::ConvertToLocalHumanReadableTime(theJob->HostingPrintQueue->StartTimeOfDay).ToShortTimeString());
// TimeConverter class is defined in the complete sample
}
if (!ReportAvailabilityAtThisTime(theJob))
{
Console::WriteLine("\nThat job is set to print only between {0} and {1}", TimeConverter::ConvertToLocalHumanReadableTime(theJob->StartTimeOfDay).ToShortTimeString(), TimeConverter::ConvertToLocalHumanReadableTime(theJob->UntilTimeOfDay).ToShortTimeString());
}
Console::WriteLine("\nThe job will begin printing as soon as it reaches the top of the queue after:");
if (theJob->StartTimeOfDay > theJob->HostingPrintQueue->StartTimeOfDay)
{
Console::WriteLine(TimeConverter::ConvertToLocalHumanReadableTime(theJob->StartTimeOfDay).ToShortTimeString());
} else
{
Console::WriteLine(TimeConverter::ConvertToLocalHumanReadableTime(theJob->HostingPrintQueue->StartTimeOfDay).ToShortTimeString());
}
}
};
internal static void ReportQueueAndJobAvailability(PrintSystemJobInfo theJob)
{
if (!(ReportAvailabilityAtThisTime(theJob.HostingPrintQueue) && ReportAvailabilityAtThisTime(theJob)))
{
if (!ReportAvailabilityAtThisTime(theJob.HostingPrintQueue))
{
Console.WriteLine("\nThat queue is not available at this time of day." +
"\nJobs in the queue will start printing again at {0}",
TimeConverter.ConvertToLocalHumanReadableTime(theJob.HostingPrintQueue.StartTimeOfDay).ToShortTimeString());
// TimeConverter class is defined in the complete sample
}
if (!ReportAvailabilityAtThisTime(theJob))
{
Console.WriteLine("\nThat job is set to print only between {0} and {1}",
TimeConverter.ConvertToLocalHumanReadableTime(theJob.StartTimeOfDay).ToShortTimeString(),
TimeConverter.ConvertToLocalHumanReadableTime(theJob.UntilTimeOfDay).ToShortTimeString());
}
Console.WriteLine("\nThe job will begin printing as soon as it reaches the top of the queue after:");
if (theJob.StartTimeOfDay > theJob.HostingPrintQueue.StartTimeOfDay)
{
Console.WriteLine(TimeConverter.ConvertToLocalHumanReadableTime(theJob.StartTimeOfDay).ToShortTimeString());
}
else
{
Console.WriteLine(TimeConverter.ConvertToLocalHumanReadableTime(theJob.HostingPrintQueue.StartTimeOfDay).ToShortTimeString());
}
}//end if at least one is not available
}//end ReportQueueAndJobAvailability
Friend Shared Sub ReportQueueAndJobAvailability(ByVal theJob As PrintSystemJobInfo)
If Not(ReportAvailabilityAtThisTime(theJob.HostingPrintQueue) AndAlso ReportAvailabilityAtThisTime(theJob)) Then
If Not ReportAvailabilityAtThisTime(theJob.HostingPrintQueue) Then
Console.WriteLine(vbLf & "That queue is not available at this time of day." & vbLf & "Jobs in the queue will start printing again at {0}", TimeConverter.ConvertToLocalHumanReadableTime(theJob.HostingPrintQueue.StartTimeOfDay).ToShortTimeString())
' TimeConverter class is defined in the complete sample
End If
If Not ReportAvailabilityAtThisTime(theJob) Then
Console.WriteLine(vbLf & "That job is set to print only between {0} and {1}", TimeConverter.ConvertToLocalHumanReadableTime(theJob.StartTimeOfDay).ToShortTimeString(), TimeConverter.ConvertToLocalHumanReadableTime(theJob.UntilTimeOfDay).ToShortTimeString())
End If
Console.WriteLine(vbLf & "The job will begin printing as soon as it reaches the top of the queue after:")
If theJob.StartTimeOfDay > theJob.HostingPrintQueue.StartTimeOfDay Then
Console.WriteLine(TimeConverter.ConvertToLocalHumanReadableTime(theJob.StartTimeOfDay).ToShortTimeString())
Else
Console.WriteLine(TimeConverter.ConvertToLocalHumanReadableTime(theJob.HostingPrintQueue.StartTimeOfDay).ToShortTimeString())
End If
End If 'end if at least one is not available
End Sub
Dvě přetížení ReportAvailabilityAtThisTime metody jsou shodná s výjimkou typu předávaného jim, takže je níže uvedena pouze PrintQueue verze.
Poznámka
Skutečnost, že metody jsou shodné s výjimkou typu, vyvolává otázku, proč ukázka nevytvoří obecnou metodu ReportAvailabilityAtThisTime<T>. Důvodem je, že taková metoda by musela být omezena na třídu, která má StartTimeOfDay a UntilTimeOfDay vlastnosti, které metoda volá, ale obecná metoda může být omezena pouze na jednu třídu a jedinou třídou společnou pro PrintQueue i PrintSystemJobInfo ve stromu dědičnosti je PrintSystemObject, která nemá žádné takové vlastnosti.
Metoda ReportAvailabilityAtThisTime (uvedená v příkladu kódu níže) začíná inicializací senzorové proměnné Boolean na true
. Pokud fronta není k dispozici, bude resetována na false
.
V dalším kroku metoda zkontroluje, jestli časy spuštění a "dokud" nejsou identické. Pokud tomu tak je, fronta je vždy k dispozici, takže metoda vrátí true
.
Pokud fronta není k dispozici po celou dobu, metoda používá statickou vlastnost UtcNow, aby získala aktuální čas jako objekt DateTime. (Nepotřebujeme místní čas, protože StartTimeOfDay a UntilTimeOfDay vlastnosti jsou samy o sobě v čase UTC.)
Tyto dvě vlastnosti však nejsou DateTime objekty. Jsou to Int32, které vyjadřují čas jako počet minut po půlnoci UTC. Takže musíme převést objekt DateTime na minuty po půlnoci. Jakmile je to hotovo, metoda jednoduše zkontroluje, zda je "teď" mezi počátečním a "do" časem fronty, nastaví sentinel na false, pokud "teď" není mezi těmito dvěma časy, a vrátí sentinel.
static Boolean ReportAvailabilityAtThisTime (PrintQueue^ pq)
{
Boolean available = true;
if (pq->StartTimeOfDay != pq->UntilTimeOfDay)
{
DateTime utcNow = DateTime::UtcNow;
Int32 utcNowAsMinutesAfterMidnight = (utcNow.TimeOfDay.Hours * 60) + utcNow.TimeOfDay.Minutes;
// If now is not within the range of available times . . .
if (!((pq->StartTimeOfDay < utcNowAsMinutesAfterMidnight) && (utcNowAsMinutesAfterMidnight < pq->UntilTimeOfDay)))
{
available = false;
}
}
return available;
};
private static Boolean ReportAvailabilityAtThisTime(PrintQueue pq)
{
Boolean available = true;
if (pq.StartTimeOfDay != pq.UntilTimeOfDay) // If the printer is not available 24 hours a day
{
DateTime utcNow = DateTime.UtcNow;
Int32 utcNowAsMinutesAfterMidnight = (utcNow.TimeOfDay.Hours * 60) + utcNow.TimeOfDay.Minutes;
// If now is not within the range of available times . . .
if (!((pq.StartTimeOfDay < utcNowAsMinutesAfterMidnight)
&&
(utcNowAsMinutesAfterMidnight < pq.UntilTimeOfDay)))
{
available = false;
}
}
return available;
}//end ReportAvailabilityAtThisTime
Private Shared Function ReportAvailabilityAtThisTime(ByVal pq As PrintQueue) As Boolean
Dim available As Boolean = True
If pq.StartTimeOfDay <> pq.UntilTimeOfDay Then ' If the printer is not available 24 hours a day
Dim utcNow As Date = Date.UtcNow
Dim utcNowAsMinutesAfterMidnight As Int32 = (utcNow.TimeOfDay.Hours * 60) + utcNow.TimeOfDay.Minutes
' If now is not within the range of available times . . .
If Not((pq.StartTimeOfDay < utcNowAsMinutesAfterMidnight) AndAlso (utcNowAsMinutesAfterMidnight < pq.UntilTimeOfDay)) Then
available = False
End If
End If
Return available
End Function 'end ReportAvailabilityAtThisTime
TimeConverter.ConvertToLocal HumanReadableTime metoda (uvedená v příkladu kódu níže) nepoužívá žádné metody představené v rozhraní Microsoft .NET Framework, takže diskuze je stručná. Metoda má úlohu dvojitého převodu: musí zpracovat celé číslo, které vyjadřuje počet minut po půlnoci, a převést je na srozumitelný čas a následně na místní čas. Toho dosáhnete tak, že nejprve vytvoříte objekt DateTime, který je nastavený na půlnoc UTC, a pak použije metodu AddMinutes k přidání minut, které byly předány metodě. Tím se vrátí nová DateTime vyjadřující původní čas, který byl předán metodě. Metoda ToLocalTime pak převede to na místní čas.
private ref class TimeConverter {
internal:
static DateTime ConvertToLocalHumanReadableTime (Int32 timeInMinutesAfterUTCMidnight)
{
// Construct a UTC midnight object.
// Must start with current date so that the local Daylight Savings system, if any, will be taken into account.
DateTime utcNow = DateTime::UtcNow;
DateTime utcMidnight = DateTime(utcNow.Year, utcNow.Month, utcNow.Day, 0, 0, 0, DateTimeKind::Utc);
// Add the minutes passed into the method in order to get the intended UTC time.
Double minutesAfterUTCMidnight = ((Double)timeInMinutesAfterUTCMidnight);
DateTime utcTime = utcMidnight.AddMinutes(minutesAfterUTCMidnight);
// Convert to local time.
DateTime localTime = utcTime.ToLocalTime();
return localTime;
};
};
class TimeConverter
{
// Convert time as minutes past UTC midnight into human readable time in local time zone.
internal static DateTime ConvertToLocalHumanReadableTime(Int32 timeInMinutesAfterUTCMidnight)
{
// Construct a UTC midnight object.
// Must start with current date so that the local Daylight Savings system, if any, will be taken into account.
DateTime utcNow = DateTime.UtcNow;
DateTime utcMidnight = new DateTime(utcNow.Year, utcNow.Month, utcNow.Day, 0, 0, 0, DateTimeKind.Utc);
// Add the minutes passed into the method in order to get the intended UTC time.
Double minutesAfterUTCMidnight = (Double)timeInMinutesAfterUTCMidnight;
DateTime utcTime = utcMidnight.AddMinutes(minutesAfterUTCMidnight);
// Convert to local time.
DateTime localTime = utcTime.ToLocalTime();
return localTime;
}// end ConvertToLocalHumanReadableTime
}//end TimeConverter class
Friend Class TimeConverter
' Convert time as minutes past UTC midnight into human readable time in local time zone.
Friend Shared Function ConvertToLocalHumanReadableTime(ByVal timeInMinutesAfterUTCMidnight As Int32) As Date
' Construct a UTC midnight object.
' Must start with current date so that the local Daylight Savings system, if any, will be taken into account.
Dim utcNow As Date = Date.UtcNow
Dim utcMidnight As New Date(utcNow.Year, utcNow.Month, utcNow.Day, 0, 0, 0, DateTimeKind.Utc)
' Add the minutes passed into the method in order to get the intended UTC time.
Dim minutesAfterUTCMidnight As Double = CType(timeInMinutesAfterUTCMidnight, Double)
Dim utcTime As Date = utcMidnight.AddMinutes(minutesAfterUTCMidnight)
' Convert to local time.
Dim localTime As Date = utcTime.ToLocalTime()
Return localTime
End Function ' end ConvertToLocalHumanReadableTime
End Class
Viz také
- DateTime
- PrintSystemJobInfo
- PrintQueue
- Dokumenty v WPF
- Přehled tisku
.NET Desktop feedback