Bir görevi belirli bir zaman sonra çalıştırma

Bir görevi belirli ve kesin bir süre sonra çalıştırmak gerekirse ne yapılır?

En basit yöntem, bir Timer kurmak ve bu Timer ın interval değerini belirli değere set ederek TimerTick olayında görevin çalışmasını tetiklemektir.  Daha komplex uygulamalarda bu yöntemi kullanmak zahmetli ya da sorunlu olabilir (Genelde de olur).

Böyle durumlarda thread kullanmak ve thread çalışması için belirli bir zaman atamak daha profesyonel bir yaklaşımdır. .NET halihazırda thread tetiklenmesi, bekletilmesi, sonlandırılması vb. işlemler için güçlü API desteği sunar.

Kameralı Kontrol uygulamamız, yakaladığı hatalı parçayı bir t süre sonra üflemek suretiyle konveyörden atacak olsun.

		public void UfleP(int t)
		{
			System.Threading.Thread.Sleep(t);
			SetDigitalOutput(1);
		}

gibi bir kod çalıştırıldığında, sistem t süresi kadar bekleyecek sonra dijital output set etmek suretiyle üfleme yapacaktır. Bu kod, bekleme süresinde (Sleep) sistemi uyutacağından, görüntü işleme uygulamalarında akla bile getirilmemelidir. Yapılması gereken, bu fonksiyonu çağıran yapıyı bir thread haline getirmek, thread i start edip unutmak, thread kendi içinde beklese bile ana programın bundan hiç etkilenmemesini sağlamaktır. Thread çalışırken bekleyecek, görevini yapacak ve en nihayetinde kendi halinde  sonlanacaktır (Terminate). Tüm bu olan bitenden ne ana programın, ne de programcını haberdar olması bile gerekmez. (Tam ideal durum. Yaz ve unut. Hiçbir Timer bu kadar kullanışlı olamazdı.)

Burada bir sorun, thread için parametre geçirmektir. Normal thread çağırırken parametre kullanımına izin vermez. Parametre kullanımı için ParameterizedThreadStart kullanmak gerekir.

Yapıyı yeniden kodlarsak;

		public void UfleP(object t)
		{
			int iSleep = (int)t;
			System.Threading.Thread.Sleep(iSleep);
			SetDigitalOutput(1);
		}

şekline dönüştürerek (parametrenin object türünden olduğuna dikkat edin. Dolayısıyla birden fazla parametre vermek, dizi geçmek vb. object türünün sağladığı sınırsız avantajlar burada kullanılabilir…)

		private void PickAfterMilliSecond(int msAfter)
		{
			System.Threading.ParameterizedThreadStart starter = new System.Threading.ParameterizedThreadStart(UfleP);
			new System.Threading.Thread(starter).Start(msAfter);
		}

gibi bir yapı ile, Parametrik Thread yapımızı programda istediğimiz yerden çağırabiliriz. Dertsiz tasasız çalışacaktır…

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir