Partager via


Comment : déterminer si un travail d'impression peut être imprimé à cette heure 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 service aurait une file d’attente différente de la maintenance de l’imprimante que d’autres services 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 PrintQueue classes et PrintSystemJobInfo les classes exposées dans les API de Microsoft .NET Framework fournissent un moyen pour case activée à 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.

  1. Lisez les propriétés et UntilTimeOfDay les StartTimeOfDay propriétés de l’élément PrintQueue pour déterminer si l’heure actuelle est entre elles.

  2. Lisez les propriétés et UntilTimeOfDay les StartTimeOfDay propriétés de l’élément PrintSystemJobInfo pour déterminer si l’heure actuelle est entre elles.

Mais les complications proviennent du fait que ces propriétés ne sont pas DateTime des objets. Au lieu de cela, il s’agit Int32 d’objets qui expriment l’heure de la journée comme 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 est transmise à une PrintSystemJobInfo méthode d’assistance et appelle des méthodes d’assistance pour déterminer si le travail peut imprimer à l’heure actuelle et, si ce n’est pas le cas, quand il peut imprimer. Notez qu’il PrintQueue n’est pas passé à la méthode. Cela est dû au fait que le fichier PrintSystemJobInfo inclut une référence à la file d’attente dans sa HostingPrintQueue propriété.

Les méthodes subordonnées incluent la méthode ReportAvailabilityAtThisTime surchargée qui peut prendre un PrintQueue ou un PrintSystemJobInfo paramètre. Il existe également un TimeConverter.ConvertToLocal HumanReadableTime. Toutes ces méthodes sont décrites ci-dessous.

La méthode ReportQueueAndJobAvailability commence par case activée ing pour voir si la file d’attente ou la tâche d’impression n’est pas disponible pour l’instant. Si l’un d’eux n’est pas disponible, il case activée de voir si la file d’attente n’est pas disponible. 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 case activée ensuite le travail et s’il n’est pas disponible, il signale l’intervalle de temps suivant lorsqu’il peut imprimer. Enfin, la méthode signale l’heure la plus ancienne à laquelle le travail peut imprimer. Il s’agit de la suite de deux fois.

  • Heure à laquelle la file d’attente d’impression est disponible.

  • Heure de la prochaine disponibilité du travail d’impression.

Lorsque vous signalez des heures de jour, la ToShortTimeString méthode est également appelée, car cette méthode supprime les années, les mois et les jours de la sortie. 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é à eux, de sorte que seule la PrintQueue version est présentée ci-dessous.

Remarque

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 à la fois PrintQueue et PrintSystemJobInfo dans l’arborescence PrintSystemObject d’héritage 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 Boolean variable sentinelle sur true. Elle sera réinitialisée falsesi la file d’attente n’est pas disponible.

Ensuite, la méthode case activée pour voir 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é statique UtcNow pour obtenir l’heure actuelle en tant qu’objet DateTime . (Nous n’avons pas besoin de l’heure locale, car les StartTimeOfDayUntilTimeOfDay propriétés sont elles-mêmes en heure UTC.)

Toutefois, ces deux propriétés ne sont pas DateTime des objets. Ils expriment Int32l’heure en tant que nombre de minutes-après-UTC-minuit. Nous devons donc convertir notre DateTime objet en minutes après minuit. Lorsque cela est terminé, la méthode case activée simplement pour voir si « maintenant » se trouve entre le début de la file d’attente et « jusqu’à », définit la sentinelle sur false si « maintenant » n’est pas entre les deux fois 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.ConvertToLocalHumReadableTime (présentée dans l’exemple de code ci-dessous) n’utilise aucune méthode introduite avec Microsoft .NET Framework. La discussion est donc 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 DateTime objet défini sur minuit UTC, puis utilise la AddMinutes méthode pour ajouter les minutes passées à la méthode. Cela retourne une nouvelle DateTime expression de l’heure d’origine passée à la méthode. La ToLocalTime méthode convertit ensuite ce paramètre 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