18 Mart 2013 Pazartesi

C Sharp Form Uygulamalar Çoklu İş Parçacığı Oluşturma



KONU : C Sharp ( C# ) Form Uygulamalar çoklu iş parçacığı oluşturma, cross thread problemini giderme, C sharp aynı anda aynı kontrolü kullanan başka bir thread başlatma, Cross thread sorununu kontrolün invoke methodu ve delegate kullanarak çözme, C sharp multithread oluşturma.



C Sharp Form Uygulamalar Çoklu İş Parçacığı Oluşturma, CrossThread Önleme, MultiThread Oluşturma

UYGULAMAYI İNDİR



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;

namespace C_Sharp_Form_Coklu_Is_Parcacık_Olusturma
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //iki farklı thread 
        Thread thread1, thread2;

        bool threadBasladi = false;
        private void button1_Click(object sender, EventArgs e)
        {
            if (threadBasladi)
            {
                thread1.Abort();
                thread2.Abort();
            }
            threadBasladi = true;
            //thread lerin başladığında çalışacak olan methodlar
            ThreadStart threadstart1 = new ThreadStart(sayMethod1);
            ThreadStart threadstart2 = new ThreadStart(sayMethod2);
            //thread leri oluşturma
            thread1 = new Thread(threadstart1);
            thread2 = new Thread(threadstart2);
            //thread isimleri
            thread1.Name = "Thread 1";
            thread2.Name = "Thread 2";
            //threadlere verilen öncelik(thread priority)
            thread1.Priority = ThreadPriority.Normal;
            thread2.Priority = ThreadPriority.Normal;
            //Thread verilebilecek öncelikler:
            //ThreadPriority.AboveNormal;
            //ThreadPriority.BelowNormal;
            //ThreadPriority.Highest;
            //ThreadPriority.Lowest;
            //ThreadPriority.Normal;
           
            //Thread leri başlatma
            thread1.Start();
            thread2.Start();
        }

        ///          /// Birinci Thread ile başlatılan method, Cross Thread olayını önlemek için invoke ile method         ///  uygun olana kadar tekrar çağırılır         /// 
        void sayMethod1()
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new DelegateStandardPattern(sayMethod1));

            }
            else
            {
                for (int i = 0; i < 1000; i++)
                {
                    listBox1.Items.Add(thread1.Name + " - " + i);
                }
            }
        }

        ///          /// İkinci Thread ile başlatılan method, Cross Thread olayını önlemek için invoke ile method         ///  uygun olana kadar tekrar çağırılır         /// 
        void sayMethod2()
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new DelegateStandardPattern(sayMethod2));

            }
            else
            {
                for (int i = 0; i < 1000; i++)
                {
                    listBox1.Items.Add(thread2.Name + " - " + i);
                }
            }
        }

        public delegate void DelegateStandardPattern();
        private void SetTextStandardPattern()
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new DelegateStandardPattern(SetTextStandardPattern));
                return;
            }
            this.Text = "New Text";
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            //multi tread yaparken karşılan problem
            //Cross call hatası almamak için => bu değer false yapılır
            //Çapraz iş parçacığı işlemi geçerli değil: 'listBox1'              
            //denetimine oluşturulduğu iş parçacığı dışında başka bir           
            //iş parçacığından erişildi.
            //CheckForIllegalCrossThreadCalls = false;

            // Ama bu doğru işlem değildir.
            // Uygun bir patern kullanılmalıdır. Yukarıdaki gibi kontrol invoke methodu ile 
            //işlem yapılacak method tekrar çağırılır.
        }
    }
}



UYGULAMAYI İNDİR

Hiç yorum yok :

Yorum Gönder