Nasıl yapılır: Günün Bu Saatinde Yazdırmanın Yapılıp Yapılmayacağını Keşfetme

Yazdırma kuyrukları her zaman günde 24 saat boyunca kullanılabilir değildir. Bunlar, günün belirli saatlerinde kullanılamaz hale getirmek için ayarlanabilecekleri başlangıç ve bitiş zamanı özelliklerine sahiptirler. Bu özellik, örneğin, 5 P.M. sonra belirli bir departmanın özel kullanımı için bir yazıcı ayırmak üzere kullanılabilir. Bu bölümün, yazıcıya hizmet veren farklı bir kuyruğu vardır. Diğer Departmanlar için sıra 5 P.M. sonra kullanılamaz, ancak sık kırmızı bölüm kuyruğu her zaman kullanılabilir olacak şekilde ayarlanabilir.

Üstelik, yazdırma işlerinin kendileri yalnızca belirtilen zaman aralığında yazdırılabilir olarak ayarlanabilir.

PrintQueuePrintSystemJobInfo Microsoft .NET Framework apı 'lerinde sunulan ve sınıfları, belirli bir yazdırma işinin geçerli zamanda belirli bir sıraya göre yazdırıp yazdıramayacağını uzaktan denetlemek için bir yol sağlar.

Örnek

Aşağıdaki örnek, bir yazdırma işiyle ilgili sorunları tanılamak için bir örnektir.

Bu tür bir işlev için aşağıdaki gibi iki önemli adım vardır.

  1. StartTimeOfDayUntilTimeOfDayPrintQueue Geçerli saatin aralarında olup olmadığını öğrenmek için öğesinin ve özelliklerini okuyun.

  2. StartTimeOfDayUntilTimeOfDayPrintSystemJobInfo Geçerli saatin aralarında olup olmadığını öğrenmek için öğesinin ve özelliklerini okuyun.

Ancak bu özelliklerin nesneler olmadığı gerçeden karmaşıklıklar ortaya çıkar DateTime . Bunun yerine, Int32 günün saatini gece yarısından beri geçen dakika sayısı olarak ifade eden nesnelerdir. Üstelik, bu, geçerli saat diliminde gece yarısı, ancak gece yarısı UTC (Eşgüdümlü Evrensel Saat).

İlk kod örneği, gönderilen ReportQueueAndJobAvailabilitystatik yöntemini gösterir ve işin geçerli saatte yazdırıp yazdıramayacağını ve ne zaman yazdırılacağını ve ne zaman yazdıramayacağını belirleyen yardımcı yöntemleri çağırır. PrintQueueYöntemine bir yönteminin geçirilmediğine dikkat edin. Bunun nedeni, öğesinin PrintSystemJobInfo özelliğindeki sıraya bir başvuru içereceğinden oluşur HostingPrintQueue .

Alt yöntemler, bir veya bir PrintSystemJobInfo parametresini parametre olarak ele geçirebilen aşırı yüklenmiş ReportAvailabilityAtThisTime yöntemini içerir. Ayrıca bir TimeConverter. ConvertToLocalHumanReadableTimevardır. Bu yöntemlerin hepsi aşağıda ele alınmıştır.

ReportQueueAndJobAvailability yöntemi, sıranın veya yazdırma işinin Şu anda kullanılabilir olup olmadığını kontrol ederek başlar. Bunlardan biri kullanılamıyorsa, sıranın kullanılamıyor olup olmadığını kontrol eder. Kullanılabilir değilse, yöntemi bu olguyu ve kuyruğun yeniden kullanılabilir olacağı saati raporlar. Ardından işi denetler ve kullanılabilir değilse, bir sonraki sefer, yazdırane zaman zaman dilimi bildirir. Son olarak, yöntemi işin yazdırabileceği en erken zamanı bildirir. Bu, aşağıdaki iki kez daha oluşur.

  • Yazdırma sırasının bir sonraki kullanıma hazır olduğu zaman.

  • Yazdırma işinin bir sonraki kullanıma hazır olduğu zaman.

Günün raporlanması sırasında ToShortTimeString Yöntem de çağrılır, çünkü bu yöntem çıktısından yıl, ay ve günü bastırır. Bir yazdırma sırasının veya bir yazdırma işinin kullanılabilirliğini belirli yıl, ay veya günlere göre kısıtlayamazsınız.

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

ReportAvailabilityAtThisTime yönteminin iki aşırı yüklemesi, geçirilen tür haricinde aynıdır, bu nedenle yalnızca Sürüm aşağıda sunulmuştur.

Not

Metodun tür hariç özdeş olması, örneğin, örnek ReportAvailabilityAtThisTime T >genel metodunu neden oluşturamadığına ilişkin soruyu oluşturur. Bunun nedeni, bu yöntemin, StartTimeOfDay ve yöntemin çağırdığı UntilTimeOfDay özelliklerine sahip bir sınıf ile kısıtlanması gerekir, ancak genel bir yöntem yalnızca tek bir sınıfla kısıtlanabilir ve hem Devralma ağacında hem de her ikisi için ortak olan tek sınıf bu PrintSystemObject tür özelliklere sahip değildir.

ReportAvailabilityAtThisTime yöntemi (Aşağıdaki kod örneğinde sunulan), için bir Sentinel değişkeni başlatılarak başlar true . falseSıra kullanılamıyorsa, olarak sıfırlanır.

Sonra, yöntemi başlangıç ve "Until" zamanlarının aynı olup olmadığını denetler. Varsa, kuyruk her zaman kullanılabilir olduğundan, yöntemi döndürür true .

Sıra her zaman kullanılabilir değilse, yöntemi UtcNow geçerli saati bir nesne olarak almak için static özelliğini kullanır DateTime . ( StartTimeOfDay Ve ÖZELLIKLERI UTC saat içinde olduğundan yerel saate ihtiyacım yoktur UntilTimeOfDay .)

Ancak, bu iki özellik nesne değildir DateTime . Bu Int32 , saati saat-UTC-gece yarısı olarak ifade ederler. Bu nedenle DateTime nesnemizi dakika sonra gece yarısından dönüştürmemiz gerekir. Bu işlem tamamlandığında, yöntemi "Şimdi" kuyruğun başlangıç ve "Until" zamanları arasında olup olmadığını denetler, "Şimdi" iki kez değilse Sentinel değerini false olarak ayarlar ve Sentinel değerini döndürür.

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. converttolocalhumanreadabletime yöntemi (aşağıdaki kod örneğinde sunulan) Microsoft .NET Framework ile sunulan herhangi bir yöntemi kullanmaz. bu nedenle, tartışma kısa olur. Yöntemin bir çift dönüştürme görevi vardır: dakika sonra gece yarısından sonra bir tamsayı almalıdır ve bunu insanla okunabilir bir zamana dönüştürür ve bunu yerel saate dönüştürmelidir. Önce DateTime gece yarısı UTC olarak ayarlanmış bir nesne oluşturarak bunu gerçekleştirir ve ardından yöntemine AddMinutes geçirilen dakikaları eklemek için yöntemini kullanır. Bu DateTime , yönteme geçirilen özgün saati ifade eden yeni bir ifade döndürür. ToLocalTimeYöntemi daha sonra bunu yerel saate dönüştürür.

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

Ayrıca bkz.