Ödevim için hoca değişken sayıda thread kullanarak 1'den 1 milyara kadar olan sayıları toplamamı istiyor.
Yani ne kadar çok thread kullanırsam bunun ne kadar faydalı olduğunu görmemi istiyor.
Aklıma takılan nokta,
Nasıl klavyeden girilen değer kadar thread oluştururum?
Ve nasıl programı girilen değer kadar parçalara bölebilirim? Yani 1'den 100'e kadar ayrı 100'den 1000'e kadar ayrı ayrı parçalara mı böleceğim ?
C# Thread Kullanımı ile ilgili
7
●2.378
- 08-11-2013, 15:51:46Kimlik doğrulama veya yönetimden onay bekliyor.1 milyara kadar olan sayıları toplarsında bunu belirli aralıklara bölmek saçma olur Thread mantığında eğer delegate, invoke işlemlerine girmeden normal bir iş parçacığı; Thread t1, gibi yapacaksan her açtığın thread o an tek iş yapar, mesela 1 milyara kadar toplama yapıp diğer bir iş parçacığında 1 milyara kadar çarpım yaparsın. Burada dikkat edeceğin şey eğer birden fazla thread kullanırsan bunlar kendi arasında çakışabilir ve hata alabilirsin. Önerilmeyen bir yol ama şimdilik şunu eklersen InitializeComponent altına
CheckForIllegalCrossThreadCalls = false;
bu kod parçacıkların çarpışmasına bir derece engel olacak. Thread, reference type dır. x sayısı buton türetmekle aynı mantık. textden girilen 1000den fazla ise bir metodda her x sayısı / 1000 = y tane thread i sayıları for ile döndürerek bir genel toplama metoduna ata. biraz karışık anlatım oldu gibi. - 08-11-2013, 18:44:10Ben hocanızı istediği şöyle bişeydir diye anladım.
Bir fonksiyon yazacaksınız verilen 2 sayı arasındaki toplamı bulacak. Sonra farklı farklı thread'ler açarak bu fonksiyonu çağıracaksınız. En son da bu fonksiyonlardan gelen değerleri toplayacaksınız.
Öncelikle threadleri direk başlatmadan bir liste içerisine kaydedip aynı anda bilgisayardaki işlemci adedi kadar thread çalışacak şekilde bir yapı oluşturursunuz. En hızlı şekilde problem çözülmüş olur. Örneğin bilgisayarda 4 işlemci varsa önce ilk 4 ü başlar herhangi birisi bittiğinde 5. başlar... - 09-11-2013, 17:23:13Merhabalar,
Threadlerle çalışmak eğer iyi derece thread bilgisine sahip değilseniz başınızı çok derde sokar. Aşağıda sizin için hazırlamış olduğum bir kod var. Çok stabil çalıştığı söylenemez zira istediğiniz şeyde zaten stabil çalışabilecek birşey değil pek. Tam olarak işinizi görmese de fikir vermesi açısından kodu kullanabilirsiniz..
İyi çalışmalar..
using System; using System.Collections.Generic; using System.Threading; using System.Windows.Forms; namespace WindowsFormsApplication2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); CheckForIllegalCrossThreadCalls = false; } private long toplam = 0; private int birMilyar = 1000000000; private long kacaKadarToplanacak = 0; private bool bitti = false; private List<Thread> trList; private System.Diagnostics.Stopwatch st; private void TrSonlandir() { if (trList == null) return; foreach (var item in trList) { try { item.Abort(); } catch { } } trList = null; } private void Bitir() { if (bitti) return; if (toplam > birMilyar) toplam = birMilyar; label1.Text = "Toplam = " + this.toplam.ToString(); kacaKadarToplanacak = 0; bitti = true; st.Stop(); var time = st.Elapsed; label3.Text = time.Seconds + " saniyede bitti!"; MessageBox.Show("Toplama bitti!"); } private void button1_Click(object sender, EventArgs e) { int girilen = int.Parse(textBox1.Text); kacaKadarToplanacak = birMilyar / girilen; label2.Text = girilen + " thread ile başladı.."; label1.Text = ""; label3.Text = ""; bitti = false; trList = new List<Thread>(); st = new System.Diagnostics.Stopwatch(); st.Start(); for (int i = 0; i < girilen; i++) { var tr = new Thread(new ThreadStart(() => { for (int j = 1; j <= kacaKadarToplanacak; j++) { if (bitti) { break; } if (this.toplam >= birMilyar) { Bitir(); } else { try { this.toplam += j; label1.Text = "Toplam = " + this.toplam.ToString(); } catch { } } } })); trList.Add(tr); tr.Start(); } } } } - 10-11-2013, 14:15:052 textbox 1 button at verdiğin toplanacak miktarı ver parça satısını ver sana toplasın.
namespace OMR.Crawler.Core.Collections { using System; using System.Collections.Concurrent; using System.Threading; /// <summary> /// This class implements a collection of multi-threaded queue. /// 2012 - OMR /// </summary> /// <typeparam name="T"></typeparam> public class MultiThreadQueue<T> : ConcurrentQueue<T> { private int _maxThreadCount; private int _runningThreadCount; /// <summary> /// ctor /// </summary> /// <param name="MaxThreadCount">Maximum count of running thread</param> public MultiThreadQueue(int MaxThreadCount) { _maxThreadCount = MaxThreadCount; } /// <summary> /// Runs multi threaded queue. /// </summary> /// <param name="action"></param> public void RunAll(Action<T> action) { while (true) { int queueCount = this.Count; // Calculates number of new threads count var newThreadCount = ( queueCount > (_maxThreadCount - _runningThreadCount) ? (_maxThreadCount - _runningThreadCount) : queueCount ); // Creates new threads for (int i = 0; i < newThreadCount; i++) { T currentWork; if (!this.TryDequeue(out currentWork)) continue; if (currentWork == null) continue; Interlocked.Increment(ref _runningThreadCount); var thread = new Thread( new ParameterizedThreadStart((x) => Run(action, currentWork)) ); thread.Start(); } if (queueCount == 0 && _runningThreadCount == 0) break; } } private void Run(Action<T> action, T item) { action(item); Interlocked.Decrement(ref _runningThreadCount); } } }private void button1_Click(object sender, EventArgs e) { DateTime baslangic = DateTime.Now; int toplam = 0; var myQueue = new MultiThreadQueue<int>(Convert.ToInt32(textBox1.Text)); for (int i = 0; i < Convert.ToInt32(textBox2.Text); i++) { myQueue.Enqueue(i); } myQueue.RunAll((x) => { toplam = toplam + x; }); DateTime bitis = DateTime.Now; TimeSpan fark = bitis - baslangic; MessageBox.Show(fark.TotalSeconds.ToString()); }