Csharp Thread Uygulaması

Thread, bir programın kendini parçalara ayırıp eş zamanlı olarak bu parçaları farklı işlemcilerde ya da bir sistem içindeki farklı bilgisayarlarda çalıştırma olayıdır. Eğer tek işlemcili bir bilgisayarda thread’ li programlar zaman dilimleme tekniği ile çalışırlar. Şöyle ki, thread‘ler sırasıyla, çalıştır-duraklat mantığı ile birbirleri arasında geçiş yaparlar. Bu geçiş anı çok kısa bir zaman dilimi olduğu için gözle farketmemiz çoğu zaman mümkün olmayabilir.

Uygulamaya değinmeden önce belirtmek isterim ki csharp dilinde thread uygulaması yapabilmek için “System.Threading” namespace’ i eklenmelidir. Verilen ön bilgilerin ardından thread uygulamasına göz atalım.



Uygulama, 1′ den n’ e kadar sayıları topluyor. Ben, sayıları ikişer ikişer toplayacak bir yapı oluşturdum. Girilen n değerine göre nxn boyutunda bir dizi oluşturdum. Bu n tane sayıyı dizinin 0. satırına attım. Her ikili toplamı threadlerde hesapladım ve sonucunu da bir alt satıra yazdırdım. Yukarıdaki şekil olayı özetler nitelikte. Aşağıdan da csharpta threading uygulamasının kodlarını inceleyebilirsiniz. Aşağıdaki form resmi üzerinde form elemanlarının isimlerini belirttim. Gerek gördüğüm yerlerde de kod üzerinde açıklama yaptım.

[cc lang =’csharp’]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Diagnostics; // Stopwatch sınıfı için eklememiz gereken namespace

namespace threadOdevi
{
public partial class Form1 : Form
{
// Süre Hesaplamaya yarayan SropWatch sınıfından nesne türettim
Stopwatch stpWatch = new Stopwatch();
long[,] sayilar;
Thread[] threads;
static long boyut;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{

}
private void btnSayilariTopla_Click(object sender, EventArgs e)
{
stpWatch.Start();
//Girilen sayı çift ise
if (boyut % 2 == 0)
{
boyut = (long.Parse(txtSayilar.Text));
sayilar = new long[boyut, boyut];
threads = new Thread[boyut – 1];
for (long i = 0; i < boyut; i++) { sayilar[0, i] = i + 1; } } //Girilen sayi tek ise if (boyut % 2 == 1) { boyut = (long.Parse(txtSayilar.Text)) + 1; sayilar = new long[boyut, boyut]; threads = new Thread[boyut - 1]; for (long i = 0; i < boyut - 1; i++) { sayilar[0, i] = i + 1; } } System.Windows.Forms.Form.CheckForIllegalCrossThreadCalls = false; Thread thread1 = new Thread(new ThreadStart(topla)); thread1.Start(); } static long i = 1; static long j = 0; static long k = 0; public void topla() { k = 0; try { for (j = 0; j < boyut/2 ; ) { sayilar[i, j] = sayilar[i - 1, k] + sayilar[i - 1, k + 1]; j++; k += 2; } } catch (Exception ee) { MessageBox.Show(ee.Message); } control(); if (a) { } else { i++; threads[i] = new Thread(new ThreadStart(topla)); threads[i].Start(); } Thread.Sleep(50); } bool a = false; // Eğer sayilar[i,1] == 0 ise toplam bulunmuş demektir. Eşit değilse toplama işlemine devam et public void control() { for (long i = 0; i < boyut; i++) { for (long j = 0; j < boyut; j++) { if (sayilar[i, 0] != 0 && sayilar[i, 1] == 0) { lbl_toplam.Text = sayilar[i, 0].ToString(); lbl_sure.Text = stpWatch.Elapsed.ToString(); stpWatch.Stop(); a = true; break; } } } } } } [/cc]

Bir cevap yazın

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