Herkese merhaba bu yazıda thread kullanımına kod olarak bakacağız. Thread nedir, ne işe yarar yazısına buradan ulaşabilirsiniz. Dediğimiz gibi thread eş zamanlı işlem yapmamızı sağlar, dikkat etmemiz gereken ilk unsur ise kritik bölgeye erişirken thread’leri zamanlamak yani içerde birisi varsa içeri başka thread almamız gerekir. Bu gibi durumları sağlamak için diğer diğer yazıda anlattığımız kritik bölge oluşturma elemanlarını kullanacağız(kritik bölge oluştruma elemanları nasıl bişeyse onu şuan ben uydurdum 🙂 ). Ama bu yazıda ilk öncelikle ortak bölgeye erişmeye çalışmayalım ve thread’lerimiz farklı işler yapsınlar. Önceki yazıda verdiğim örneğe benzer bir örnek yapalım programımız bu siteden bazı resimler çeksin ve form ekranının bir kenarında sergilesin, diğer bir tarafta butona basınca progress bar dolsun, diğer bir tarfta ise yine başka bir butona basınca listbox’a veri yazsın, thread sayesinde tüm bu işlemleri aynı anda yaptıracağız.
İlk önce thread nasıl oluşturulur nasıl başlatırlır, susturulur, geri çalıştırılır basitce ona bakalım;
System.Windows.Forms.Form.CheckForIllegalCrossThreadCalls = false;//windows bazen kendi oluşturduğumuz thread'lere izin vermiyor bu engeli aşmak için
using System.Threading;//thread kullanımı için eklmemiz gereken kütüphane
Thread thread = new Thread(threadFonk);//burada bir fonksiyon ismi yazacağız thread bu fonksiyonu çalıştıracak
thread.Start();//thread'i başlatmamız gerekir
thread.Suspend();//thread'i durdurur ama yok edemez sadece susturur
thread.Resume();//duran thread'i geri çalıştırır
void threadFonk()//çalışacak fonksiyon
{
.... çalışacak işlemler
Thread.Sleep(1000);//thread'i yavaşlatmak istersek kullanacağımız fonksiyon
}
Şimdi en üstte bahsettiğimiz örneğe bakalım;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;//thread kullanımı için eklmemiz gerek kütüphane
namespace blogTiretKullanimi1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
System.Windows.Forms.Form.CheckForIllegalCrossThreadCalls = false;//windows bazen kendi yazdığımız thread'leri kullanmamız engelliyor
}//bu engeli kaldırmak için yazdığımız satır
private void button1_Click(object sender, EventArgs e)
{
Thread progresDoldurThread = new Thread(progresDoldurucu);//İlk thread'imiz progres bar doldurmak için
progresDoldurThread.Start();//Thread'i başlatıyoruz
}
private void progresDoldurucu()//progresDoldurThread'i için yazdığımız fonksiyon
{
while(true)//progres bar dolana kadar dönen döngümüz
{
progressBar1.Maximum = 100;//progres bar'ın maximum değeri
progressBar1.Value += 10;//değerinin kaçar kaçar artacağı
Thread.Sleep(1000);//fonksiyonun bekleme süresi mili saniye cinsinden
}
}
private void Form1_Load(object sender, EventArgs e)//form ekranı ilk açılırken resimleri çekmeye başlıyor
{
Thread resimDonder=new Thread(resimCekici);//göstereceğimiz resimler için oluşturduğumuz thread
resimDonder.Start();//thread başlatma
}
private void resimCekici()//resimleri siteden çekmek için yazdığımız thread fonksiyonu
{
while(true)//resimler picture box'ımızda 1 er saniye ara ile gösteriliyor
{
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;//gelen resmi picture box'ın boyutuna göre ölçeklendiriyoruz
pictureBox1.Image = resimGetir(@"http://ibrahimozcelik.net/wp-content/uploads/2017/06/Ekran-Al%C4%B1nt%C4%B1s%C4%B1-1-640x320.png");
Thread.Sleep(1000);//thread fonksiyonunu 1 saniye duraklatıp diğer resmi çekiyoruz
pictureBox1.Image = resimGetir(@"http://ibrahimozcelik.net/wp-content/uploads/2017/06/oneCikanGorsel1-640x405.png");
Thread.Sleep(1000);
pictureBox1.Image = resimGetir(@"http://ibrahimozcelik.net/wp-content/uploads/2017/07/uzak-640x427.png");
Thread.Sleep(1000);
pictureBox1.Image = resimGetir(@"http://ibrahimozcelik.net/wp-content/uploads/2017/07/tiret1-640x448.png");
Thread.Sleep(1000);
}
}
Bitmap resimGetir(String url)//siteden gelen url ile resimler çekiliyor
{
WebRequest resimIstek = WebRequest.Create(url);//url için istek yapıyoruz
return (Bitmap)Bitmap.FromStream(resimIstek.GetResponse().GetResponseStream());//geri dönen resmi resimCekici fonksiyonuna gönderiyoruz
}
private void button2_Click(object sender, EventArgs e)//son thread'imizin olduğu kısım
{
Thread listBoxThread = new Thread(listBoxDoldur);//listbox'ı  doldurmak için kullandığımız thread
listBoxThread.Start();//thread başlatılıyor
}
private void listBoxDoldur()//thread fonksiyonumuz
{
while(true)
{
listBox1.Items.Add("ibrahim ÖZÇELİK");//thread çalışınca sürekli listbox'a ekliyor
Thread.Sleep(500);//yarım saniye bekleme süresi
}
}
}
}
Bu yazıda thread’lerin eş zamanlı kullanılabileceğine dair bir örnek vermeye çalıştım, bu çok basit bir örnek, thread artık olmazsa olmaz sonra ki yazıda threadler ile ortak alana erişmeyi anlatmaya çalışacağım herkese iyi çalışmalar.
