Guide pratique pour déterminer si un travail d’impression peut être imprimé à ce moment de la journée
Les files d’attente d’impression ne sont pas toujours disponibles pendant 24 heures par jour. Ils ont des propriétés de début et de fin qui peuvent être définies pour les rendre indisponibles à certains moments de la journée. Cette fonctionnalité peut être utilisée, par exemple, pour réserver une imprimante pour l’utilisation exclusive d’un certain service après 5 heures. Ce département aurait une file d'attente desservant l'imprimante différente de celle que d'autres départements utilisent. La file d’attente des autres ministères serait définie pour être indisponible après 17 heures, tandis que la file d’attente du service privilégié pourrait être définie pour être disponible à tout moment.
En outre, les travaux d’impression eux-mêmes peuvent être définis pour être imprimables uniquement dans un intervalle de temps spécifié.
Les classes PrintQueue et PrintSystemJobInfo exposées dans les API de Microsoft .NET Framework permettent de vérifier à distance si un travail d’impression donné peut imprimer sur une file d’attente donnée à l’heure actuelle.
Exemple
L’exemple ci-dessous est un exemple qui peut diagnostiquer les problèmes liés à un travail d’impression.
Il existe deux étapes majeures pour ce type de fonction comme suit.
Lisez les propriétés StartTimeOfDay et UntilTimeOfDay de l'PrintQueue pour déterminer si l’heure actuelle est comprise entre ces deux valeurs.
Lisez les propriétés StartTimeOfDay et UntilTimeOfDay de l'PrintSystemJobInfo pour déterminer si l’heure actuelle est entre les deux.
Mais les complications proviennent du fait que ces propriétés ne sont pas DateTime objets. Au lieu de cela, ce sont des objets Int32 qui expriment l'heure de la journée en tant que nombre de minutes depuis minuit. En outre, ce n’est pas minuit dans le fuseau horaire actuel, mais minuit UTC (temps universel coordonné).
Le premier exemple de code présente la méthode statique ReportQueueAndJobAvailability, qui reçoit un PrintSystemJobInfo et appelle des méthodes d’assistance pour déterminer si la tâche peut être imprimée actuellement et, sinon, quand elle peut l'être. Notez qu’un PrintQueue n’est pas transmis à la méthode. En effet, le PrintSystemJobInfo contient une référence à la file d’attente dans sa propriété HostingPrintQueue.
Les méthodes subordonnées incluent la méthode ReportAvailabilityAtThisTime surchargée qui peut prendre un PrintQueue ou un PrintSystemJobInfo en tant que paramètre. Il existe également un TimeConverter.ConvertToLocalHumanReadableTime. Toutes ces méthodes sont décrites ci-dessous.
La méthode ReportQueueAndJobAvailability commence par vérifier si la file d’attente ou le travail d’impression n’est pas disponible pour l’instant. Si l’un d’eux n’est pas disponible, il vérifie alors si la file d’attente est indisponible. S’il n’est pas disponible, la méthode signale ce fait et l’heure à laquelle la file d’attente sera de nouveau disponible. Il vérifie ensuite le travail et, s'il n'est pas disponible, il signale la prochaine intervalle de temps disponible pour l'impression. Enfin, la méthode signale l'heure la plus proche à laquelle le travail peut être imprimé. Il s'agit de la plus tardive des deux heures suivantes.
Heure à laquelle la file d’attente d’impression sera de nouveau disponible.
L’heure à laquelle le travail d’impression est de nouveau disponible.
Lorsque vous indiquez l'heure de la journée, la méthode ToShortTimeString est également appelée ainsi, car elle supprime les années, les mois et les jours du résultat. Vous ne pouvez pas restreindre la disponibilité d’une file d’attente d’impression ou d’une tâche d’impression à des années, des mois ou des jours particuliers.
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
Les deux surcharges de la méthode ReportAvailabilityAtThisTime sont identiques, à l'exception du type passé en paramètre, donc seule la version PrintQueue est présentée ci-dessous.
Note
Le fait que les méthodes sont identiques à l’exception du type soulève la question de savoir pourquoi l’exemple ne crée pas de méthode générique ReportAvailabilityAtThisTime<T>. La raison est qu'une telle méthode doit être limitée à une classe qui a les propriétés StartTimeOfDay et UntilTimeOfDay que la méthode appelle, mais une méthode générique ne peut être limitée qu'à une seule classe et la seule classe commune à PrintQueue et PrintSystemJobInfo dans l'arborescence d'héritage est PrintSystemObject qui n'a pas de telles propriétés.
La méthode ReportAvailabilityAtThisTime (présentée dans l’exemple de code ci-dessous) commence par initialiser une variable sentinelle Boolean sur true
. Elle sera réinitialisée à false
, si la file d’attente n’est pas disponible.
Ensuite, la méthode vérifie si les heures de début et « jusqu’à » sont identiques. Si elles le sont, la file d’attente est toujours disponible, de sorte que la méthode retourne true
.
Si la file d’attente n’est pas disponible tout le temps, la méthode utilise la propriété UtcNow statique pour obtenir l’heure actuelle en tant qu’objet DateTime. (Nous n’avons pas besoin de l’heure locale, car les propriétés StartTimeOfDay et UntilTimeOfDay sont elles-mêmes en heure UTC.)
Toutefois, ces deux propriétés ne sont pas des objets DateTime. Ce sont des Int32 exprimant l’heure en tant que nombre de minutes après minuit UTC. Nous devons donc convertir notre objet DateTime en minutes après minuit. Ensuite, la méthode vérifie simplement si « maintenant » se situe entre les heures de début et de fin (« jusqu’à... ») de la file d’attente. Elle définit la sentinelle sur false si « maintenant » ne se situe pas entre les deux heures, et retourne la sentinelle.
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
La méthode TimeConverter.ConvertToLocal HumanReadableTime (présentée dans l’exemple de code ci-dessous) n’utilise aucune méthode introduite avec Microsoft .NET Framework, de sorte que la discussion est brève. La méthode a une tâche de conversion double : elle doit prendre un entier exprimant des minutes après minuit et la convertir en temps lisible par l’homme et doit la convertir en heure locale. Pour ce faire, il crée d’abord un objet DateTime défini sur minuit UTC, puis utilise la méthode AddMinutes pour ajouter les minutes passées à la méthode. Cela retourne un nouveau DateTime exprimant l’heure d’origine qui a été transmise à la méthode. La méthode ToLocalTime convertit ensuite cela en heure locale.
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
Voir aussi
- DateTime
- PrintSystemJobInfo
- PrintQueue
- Documents dans WPF
- Vue d’ensemble de l’impression
.NET Desktop feedback