Thread bilgisayar biliminde, bir programın kendini eş zamanlı birden fazla iş parçasına ayırabilmesinin bir yoludur. Thread ve işlem arasındaki fark bir işletim sisteminden diğerine değişmekle birlikte genel olarak thread oluşturuluşu ve kaynakları paylaşması açısından process'den ayrılır. Çoklu thread'ler paralel olarak pek çok bilgisayar sisteminde uygulanabilir. Tek işlemci kullanıldığı durumlarda çok thread' li uygulama zaman dilimleme ile gerçekleştirilir; tek işlemci faklı thread' lar arasında çok hızlı geçiş yapar ve bu durumda işlemler gerçekte olmasa bile eş zamanlı koşuluyormuş izlenimi verir. Çok işlemcili sistemlerde farklı thread' ler farklı işlemciler üzerinde eş zamanlı olarak çalışabilir.
Pek çok modern işletim sistemi bir iş düzenleyicisi yardımıyla hem zaman dilimleme hem de çok işlemcili thread' lemeyi desteklemektedir. İşletim sistem çekirdeği (kernel) sistem çağrıları vasıtası ile programcıya thread' leri kontrol etme imkânı sağlamaktadır. Bunun yokluğunda programlar, zamanlayıcılar, sinyaller veya diğer yöntemleri kullanarak kendi çalışmalarını sonlandırabilirler. Bunlara user-space thread' ler denir.
Bizde yazdığımız programlarda aynı anda birden fazla işlem yaptırmak istiyorsak Threadleri kullanabiliriz. Farklı threadler aynı fonksiyonu kullanabileceği gibi her thread farklı bir iş yapan ayrı fonksiyonlarıda kullanabilir. Threadleri kullanarak basit bir uygulama yazalım.
?
1
2
3
4
5
6
7
|
Thread thread1 = new Thread( new ThreadStart(ProgressBar1Doldur));
Thread thread2 = new Thread( new ThreadStart(ProgressBar2Doldur));
Thread thread3 = new Thread( new ThreadStart(ProgressBar3Doldur));
thread1.Start();
thread2.Start();
thread3.Start();
|
Yukarıdaki kodda gördüğünüz gibi ilk olarak yeni bir thread oluşturuyor ve bu threadin kullanacağı fonksiyonu da ThreadStart nesnesi içinde yazıyoruz. thread1.Start() dediğimiz zaman ThreadStart içine yazmış oluğumuz kodlar ilgili thread tarafından işlenmeye başlar.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
public void ProgressBar1Doldur()
{
while (progressBar1.Value < 100)
{
progressBar1.Value += 1;
Thread.Sleep(10);
}
}
public void ProgressBar2Doldur()
{
while (progressBar2.Value < 100)
{
progressBar2.Value += 1;
Thread.Sleep(60);
}
}
public void ProgressBar3Doldur()
{
while (progressBar3.Value < 100)
{
progressBar3.Value += 1;
Thread.Sleep(50);
}
}
|
Her thread oluşturulurken belirlenmiş olan fonksiyon içindeki kodları çalıştırır ve fonksiyonda ki işlemler bittiği zaman otomatik olarak sonlanır.
Aşağıdaki formu dizaynını yapıp yukarıdaki gibi bir kod yazar ve derlerseniz “Çapraz iş parçacığı işlemi geçerli değil: 'progressBar1' denetimine oluşturulduğu iş parçacığı dışında başka bir iş parçacığından erişildi.” Diye bir hata alırsınız. Bunun sebebi threadlerin senkronlanmadığındandır. Bir threadin kullandığı bir nesneye başka bir thread erişmeye çalıştığı anda yukarıdaki hatayı alırsınız. Bu hatayı almamak için threadleri senkron olarak çalıştırmanız gerekiyor. Threadleri senkron olarak çalıştırma konusuna daha sonra gireceğiz. Şimdili yukarıdaki hatayı engellemek için threadleri çalıştırmadan ince aşağıdaki kodu ekleyin.
?
1
2
3
4
5
6
7
8
9
|
System.Windows.Forms.Form.CheckForIllegalCrossThreadCalls = false ;
Thread thread1 = new Thread( new ThreadStart(ProgressBar1Doldur));
Thread thread2 = new Thread( new ThreadStart(ProgressBar2Doldur));
Thread thread3 = new Thread( new ThreadStart(ProgressBar3Doldur));
thread1.Start();
thread2.Start();
thread3.Start();
|