Arşiv

Etiketlenen yazılar TimeSpan

Windows 8 Metro Style Uygulamalarda ProgressRing Kullanımı

23 Kasım 2011 1 yorum

Uygulamalarımızda uzun süren işlemler sırasında, kullanıcıya işlemin sürdüğünü göstermek için genellikle yükleniyor (loading) göstergeleri kullanırız.

Windows 8 için geliştirdiğimiz Metro Style uygulamalarda bu yeteneği uygulamamıza katmak için ProgressRing sınıfından faydalanabiliriz.

Bu makalede uygulamanın açılışı esnasında bir yükleniyor (loading) göstergesi ekrana getireceğiz, 5 saniye bekledikten sonra (uygulamanın ihtiyaç duyacağı tüm modüllerin yüklenmesi 5 saniye sürecek diye varsayıyoruz) yükleniyor göstergesini ekrandan kaldıracak ve Gerekli Modüller Yüklendi metnini ekranda göstereceğiz.

Hemen yeni bir Visual Studio 2011 açarak örnek proje üzerinde geliştirmeye başlayalım;

Yeni Proje oluşturma dialog kutusunda Windows Metro Style grubunda yer alan Application proje şablonunu seçelim ve projemize bir isim verelim (bu örnekte benim kullandığım isim, ProgressRingOrnek)

Proje oluşturulduğunda MainPage.xaml dosyasının içeriği;

<UserControl x:Class="ProgressRingOrnek.MainPage"
	xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
	xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
	xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
	mc:Ignorable="d"
	d:DesignHeight="768" d:DesignWidth="1366">

	<Grid x:Name="LayoutRoot" Background="#FF0C0C0C">
	</Grid>

</UserControl>

Öncelikle Grid elementi içerisine bir tane ProgressRing, bir tane de TextBlock nesnesi ekliyoruz;

<ProgressRing x:Name="ProgressItem" HorizontalAlignment="Center" VerticalAlignment="Center" Width="240" Height="240" />

<TextBlock x:Name="MessageItem" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="Collapsed" Text="Gerekli Modüller Yüklendi!" FontSize="22" />

ProgressRing elementini ekranda yatay eksende (HorizontalAlignment) ve dikey eksende (VerticalAlignment) ortalıyoruz (Center), ayrıca genişlik (Width) ve yükseklik (Height) değerlerini de belirliyoruz (240 px).

TextBlock elementini de ekranda yatay eksende (HorizontalAlignment) ve dikey eksende (VerticalAlignment) ortalıyoruz (Center), font boyutunu (FontSize) ayarlıyoruz (22 px), ekranda gözükmemesi için Visibility özelliğine Collapsed değerini veriyoruz.

HorizontalAlignment özelliğine verilebilecek değerler;

  • Center
  • Left
  • Right
  • Stretch

VerticalAlignment özelliğine verilebilecek değerler;

  • Bottom
  • Center
  • Stretch
  • Top

Visibility özelliğine verilebilecek değerler;

  • Collapsed
  • Visible

MainPage.xaml.cs dosyasında, MainPage sınıfının constructor‘ında ilk önce ProgressRing nesnesini ekranda gösterelim;

ProgressItem.IsActive = true;

5 saniye gecikme sağlayıp, istediğimiz işi yapacak kodu yazmaya başlayalım. Bu iş için DispatcherTimer sınıfını kullanacağız.

TimeSpan tipinde Interval özelliğine 5 saniye gecikme sağlayacak TimeSpan.FromSeconds(5) değerini veriyoruz;

timer.Interval = TimeSpan.FromSeconds(5);

DispatcherTimer nesnesinin Tick olayını yakalayıp, ProgressRing nesnesini ekrandan gizlemeli, TextBlock nesnesini ekranda göstermeliyiz;

timer.Tick += delegate(object sender, object e)
{
	timer.Stop();

	ProgressItem.IsActive = false;
	MessageItem.Visibility = Visibility.Visible;
};

Son olarak, DispatcherTimer nesnesinin Start() method’unu kullanarak, 5 saniyelik süreci başlatıyoruz.

DispatcherTimer nesnesinin Interval özelliğinde belirlediğimiz süre dolduğunda Gerekli Modüller Yüklendi mesajı ekranda belirecek;

C# Performans Analiz Sınıfı

20 Kasım 2011 Yorum yapılmamış

Geliştirmekte olduğumuz uygulamalarda performans analizi yapmak için genellikle Stopwatch sınıfını kullanırız.

Aşağıdaki sınıf’ı kullanarak uygulamanın her method‘unu kolay analiz edebiliriz;

public class PerformansAnaliz
{
	public TimeSpan ToplamSure { get; private set; }
	public TimeSpan OrtalamaSure { get; private set; }

	public static PerformansAnaliz Yeni()
	{
		return new PerformansAnaliz();
	}

	public void Olcumle(Action Method, int TekrarAdet = 1)
	{
		var sw = Stopwatch.StartNew();
		for (int iLoop = 0; iLoop < TekrarAdet; iLoop++)
		{
			Method();
		}
		sw.Stop();
		OrtalamaSure = new TimeSpan(sw.Elapsed.Ticks / TekrarAdet);
		ToplamSure = sw.Elapsed;
	}
}

C# Windows’un Boş Zamanını (Idle Time) Bulmak

30 Temmuz 2010 Yorum yapılmamış

Yazdığınız bir uygulamanın vakit alıcı bazı işlerini, Windows’un kullanılmadığı zamanlarda gerçekleştirmek isteyebilirsiniz.

Yapmamız gereken, uygulamamızın, Windows’un kullanılmadığı zamanı anlayabileceği ve sayabileceği bir yönteme sahip olmasını sağlamak.

Böylece Windows belirli bir süre boyunca kullanılmadığında, uygulamamızın çeşitli görevleri başlatmasını sağlayabiliriz.

Windows’un kullanılmadığı süreyi ölçmek için, öncelikle son kullanıldığı zamanı bulmamız gerekmektedir.

İlk olarak, kodumuzun using kısmına System , System.Runtime.InteropServices ve System.Timers namespace‘lerini ekleyelim.

System.Runtime.InteropServices namespace’i Windows API‘lerini uygulamamıza eklememize yarayan sınıfları barındırmaktadır.

DllImport sınıfını kullanarak, user32.dll Windows API‘sinde yeralan GetLastInputInfo methodunu uygulamamıza ekleyebiliriz.

GetLastInputInfo method’u sayesinde ihtiyacımız olan, Windows’un son kullanılma zamanını alabileceğiz.

[DllImport("user32.dll")]
static extern bool GetLastInputInfo(ref LastInputInfo plii);

Toplam Kullanılma Zamanından, Son Kullanılma Zamanını çıkarttığımızda, Windows’un Kullanılmadığı Boş Zamanı bulmuş olacağız.

TimeSpan.FromMilliseconds(Environment.TickCount - info.dwTime)

GetLastInputInfo method’u parametre olarak LastInputInfo tipinde bir struct istemektedir.

public struct LastInputInfo
{
	public uint cbSize;
	public uint dwTime;
}

Uygulamamızın başlangıcında bir Timer oluşturuyoruz ve Elapsed olayında, Windows’un kullanılmadığı süreyi ekrana yazdırıyoruz.

Örnek uygulamanın tüm kodu;

using System;
using System.Runtime.InteropServices;
using System.Timers;

public struct LastInputInfo
{
	public uint cbSize;
	public uint dwTime;
}

public class Program
{
	[DllImport("user32.dll")]
	static extern bool GetLastInputInfo(ref LastInputInfo plii);

	static LastInputInfo info = new LastInputInfo();

	public static TimeSpan GetInactiveTime()
	{
		if (GetLastInputInfo(ref info))
			return TimeSpan.FromMilliseconds(Environment.TickCount - info.dwTime);
		else
			return TimeSpan.Zero;
	}

	static void Main(string[] args)
	{
		info.cbSize = (uint)Marshal.SizeOf(info);

		Timer t = new Timer(1000);
		t.Start();
		t.Elapsed += delegate { Console.WriteLine(GetInactiveTime().ToString()); };

		Console.ReadLine();
	}
}