Rehber C# Hassas bekleme kütüphanesi Winhooks nasıl kullanılır?

Windows'taki popüler bekleme sınıflarını bir araya toplayıp detaylandırdım. Ve o artık public! Bekleme sürelerini HighRes ile mikro saniye sapmalarla kendi uygulamalarınızı en hassas şekilde geliştirmenize yarayan yardımcı bir .NET 9 C# kütüphanesi.

Nasıl kullanılır?​

ReisProduction Adresinden Windelay'i indiriyoruz.
Ben size göstermek amaçlı .NET 9 C# Console Application oluşturuyorum.
Öncelikle bu projenin .NET 9 ve Minimum Windows 19041 sürümü gerektiğini size bildirmek isterim. İsterseniz kendiniz fork atıp eski versiyonlara da uyumlu hâle getirebilirsiniz de zaten eski bilgisayarlara Sleep veya Delay methodları yetecektir. Ne kadar hassas bir bekleme yapacaksınız ki?
1756248067886.png

Windelay kütüphanesini ekliyoruz:
1756248130226.png

Kodu test etme vakti. Aşağıda sapma süreleri ve kodlar bulunuyor:
1756249709199.png

C#:
using ReisProduction.Windelay.Utilities.Enums;
using ReisProduction.Windelay.Utilities;
using System.Diagnostics;
using static ReisProduction.Windelay.Models.DelayExecutor;
internal class Program
{
    private static void Main(string[] __)
    {
        Console.WriteLine("Hello, Techonpat Social!");
        StartTest();
        Console.ReadLine();
    }
    private static async void StartTest()
    {
        Random rnd = new();
        CancellationTokenSource cts = new();
        Console.WriteLine("HybridDelay Test Başladı\n");
        //SpinWaitIterations = 10; // İsterseniz daha hassas yapabilirsiniz fakat gereksiz olur. Zaten 25 çok agresif bir hassaslık.
        // SpinWait için iterasyon sayısı (Varsayılan: İşlemci çekirdeğine göre değişir.)
        // public static int SpinWaitIterations { get; set; } = Math.Clamp(200 / Environment.ProcessorCount, 25, 100);
        //SpinAheadMilisecond = 500; // İsterseniz daha hassas yapabilirsiniz fakat iyi bilgisayarlar için gereksiz olur. Kötü bilgisayarlar için ise max 500ms yeterlidir.
        // HybridDelay için SpinAhead süresi (Varsayılan: 200ms)
        //public static int SpinAheadMilisecond { get; set; } = 200;
        for (int i = 0; i < 20; i++)
        {
            int ms = rnd.Next(200, 2000); // 200ms - 1000ms arası random süre
            DelayAction delay = new
            (
                ms,
                cts.Token, // İptal edebilmek için
                DelayType.HybridDelay // Delay türü (Burada HybridDelay kullanıldı) Sistemi en az yorarak en doğru sonucu verir.
                                      // Ancak DelayType vermek, sadece HandleDelay() methodunda geçerlidir.
            );

            Stopwatch sw = Stopwatch.StartNew();
            //HandleDelay(delay); // DelayType parametresi verilmezse, default olarak HybridDelay kullanılır.
            await HybridDelay(delay); // En sağlıklı ve önerilen yöntem budur.
            sw.Stop();

            double elapsed = sw.Elapsed.TotalMilliseconds,
                      diff = elapsed - ms;

            Console.WriteLine($"Hedef: {ms,4:0000} MS | Beklenen: {elapsed,8:0000.00} MS | Sapma: {diff,8:+0000.00;-0000.00;+0000.00} MS");
        }
        Console.WriteLine("\nTest Bitti.\nHighResSpin Test Başladı");
        for (int i = 0; i < 20; i++)
        {
            int ms = rnd.Next(10, 1000); // 10ms - 1000ms arası random süre
            DelayAction delay = new
            (
                ms,
                cts.Token, // İptal edebilmek için
                DelayType.HybridDelay // Delay türü (Burada HybridDelay kullanıldı) Sistemi en az yorarak en doğru sonucu verir.
                                      // Ancak DelayType vermek, sadece HandleDelay() methodunda geçerlidir.
            );

            Stopwatch sw = Stopwatch.StartNew();
            //HandleDelay(delay); // DelayType parametresi verilmezse, default olarak HybridDelay kullanılır.
            HighResSpin(delay); // En sağlıklı ve önerilen yöntem budur.
            sw.Stop();

            double elapsed = sw.Elapsed.TotalMilliseconds,
                      diff = elapsed - ms;

            Console.WriteLine($"Hedef: {ms,4:0000} MS | Beklenen: {elapsed,8:0000.00} MS | Sapma: {diff,8:+0000.00;-0000.00;+0000.00} MS");
        }
        Console.WriteLine("\nTest Bitti.");
    }
}
Yakında Winhook ve Winjoys'u da public yapmayı düşünüyorum. Belki sonrasında yapacağım Winmacro'yu da ücretsiz olarak public sunabilirim. Ben macro kullanmayı seven birisiyim ve Jitbit Recorder'a bağlı kalmaktan memnun değilim. Daha iyisini ücretsiz bir şekilde yapabileceğimi düşünüyorum. Şu anda gayet iyi gidiyorum. Görünüm olarak da WinUI 3 kullanacağımdan, o konuda problemim olmayacak. Kütüphaneyi inceleyip eklememi istediğiniz özellik veya düzeltmem gereken bir bug bulursanız bildirmeyi unutmayın. Şimdilik bitti ve rafa kaldırdım. Arada bir değişiklik olursa güncellemeler getiririm.

Sırada ise LowLevel Hook ve ardından LowLevel Injector'u tamamen bitirip public yapacağım.

NOT: Güncellemeler pushlanıp v25.5.1 olarak GitHub'a eklenmiştir. NuGet olarak da eklenmiştir.

İyi günler ve iyi çalışmalar dilerim!

Yakında çıkacak Windoc uygulamamı takip etmek için: Bilgisayarın sağlığını ve performansını kontrol eden uygulamam Windoc
 
Son düzenleyen: Moderatör:
@TheAny, @Bayram Reis çok güzel tartışma çıkarmışsınız. Okurken keyif aldım valla. İkinizin de emeğine sağlık.
Tartışma değil de fikir alışverişi denebilir. Ben bazı kısımlarda yanış anlamış ve anlaşılmışım. Telefondan okuduğum için bazıları gözümden kaçmış. Şu an pc'den tekrar okudum da bazı şeyleri baya yanlış anlamışım.
Tabii ki senin degil. O yuzden zaten;
Mesela burayı biraz geç farkettim. Başkaları için dediğini. Çünkü ben bu kütüphaneyi o amaçla yaptım zaten. Ama bilmeyenler için önemli notlar vermiş. Ben açıklama satırıyla pek uğraşmam şahsen. Zaten hep tek başıma çalışıyorum. Eskisi gibi karmaşık çalışmadığımdan herkesin kolayca anlayabileceğini düşünüyorum.

Kendisinin bilgisi benimkinden fazladır. Ben yeni yeni senior olma çabasındayım işte :)
Yakında okul da başlayacak. İyicene daha kompleks yapılar yapmaya başlarım.

Teşekkür ederim.
 
Tartışma değil de fikir alışverişi denebilir. Ben bazı kısımlarda yanış anlamış ve anlaşılmışım. Telefondan okuduğum için bazıları gözümden kaçmış. Şu an pc'den tekrar okudum da bazı şeyleri baya yanlış anlamışım.

Mesela burayı biraz geç farkettim. Başkaları için dediğini. Çünkü ben bu kütüphaneyi o amaçla yaptım zaten. Ama bilmeyenler için önemli notlar vermiş. Ben açıklama satırıyla pek uğraşmam şahsen. Zaten hep tek başıma çalışıyorum. Eskisi gibi karmaşık çalışmadığımdan herkesin kolayca anlayabileceğini düşünüyorum.

Kendisinin bilgisi benimkinden fazladır. Ben yeni yeni senior olma çabasındayım işte :)
Yakında okul da başlayacak. İyicene daha kompleks yapılar yapmaya başlarım.

Teşekkür ederim.
Tartışma derken ben de o manada söyledim zaten. Yoksa bir atışma yok tabi ki. Böyle teknik tartışmaları okumak hoşuma gidiyor. Teşekkür ederiz.
 
Tek problem Lowlevel hook ve Input sınıfının System.VirtualKey sınıfından olması ve Türkçe karakterleri desteklememesi. Henüz bakmadım ama illa bir yöntemi vardır.
@TheAny Onu da çözmem 20DK'ımı almadı. Oem'ler varmış. Buraya da beklerim:
 

Technopat Haberler

Yeni konular

Geri
Yukarı