folder Tahribat.com Forumları
linefolder C#, Asp.Net, .Net Core
linefolder C# Multithread Tetikleyici



C# Multithread Tetikleyici

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    mstraker
    mstraker's avatar
    Kayıt Tarihi: 11/Haziran/2007
    Erkek

    Bugün bir soruyla karşılaştım ve çözemedim soru şöyle;

     

    C# da benim bir dizim var.Arka planda bir thread olacak ama uyku durumda. Ne zamanki dizi boyutu değişti bir tetikleyici diyecekki kalk dizinin boyutu değişti bu diziyi al.Bu thread uyku durumdan kalkacak diziyi alıp gerekli yere kaydedip tekrar uyku durumuna geçecek.

     

    Sorun bu.Benim şuan ki sistemim belirli zaman aralıklarıyla diziyi kontrol ediyor ve değişiklik varsa bu işlemleri yapıyor.Bu da tabiki performans ve zaman kaybı.Yukarda belirttiğim sistem mümkün mü nasıl?  


    what makes you think i am not?
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    real_agabey
    real_agabey's avatar
    Kayıt Tarihi: 28/Ekim/2003
    Erkek

    Programlama olarak bilmiyorm fakat yapmak istediğini yapan back up programları dolu.

    İncelersen biri bu konuda.

    http://tahribat.com/Forum-Bilgisayariniza-Takilan-Usb-Cdrom-Daki-Verileri-Calin-Resimli-61147/

  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    mstraker
    mstraker's avatar
    Kayıt Tarihi: 11/Haziran/2007
    Erkek

    real_agabey bunu yazdı:
    -----------------------------

    Programlama olarak bilmiyorm fakat yapmak istediğini yapan back up programları dolu.

    İncelersen biri bu konuda.

    http://tahribat.com/Forum-Bilgisayariniza-Takilan-Usb-Cdrom-Daki-Verileri-Calin-Resimli-61147/


    -----------------------------

    İlgin alakan yeter kardeşim sağol ama bahsettiğim şey çok farklı bişey 


    what makes you think i am not?
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    guru
    guru's avatar
    Kayıt Tarihi: 30/Mart/2007
    Erkek

    bu bir senkronizasyon meselesi. 

    using System;
    using System.Threading;
    
    class ThreadingExample
    {
        static AutoResetEvent autoEvent;
    
        static void DoWork()
        {
            Console.WriteLine("   worker thread started, now waiting on event...");
            autoEvent.WaitOne();
            Console.WriteLine("   worker thread reactivated, now exiting...");
        }
    
        static void Main()
        {
            autoEvent = new AutoResetEvent(false);
    
            Console.WriteLine("main thread starting worker thread...");
            Thread t = new Thread(DoWork);
            t.Start();
    
            Console.WriteLine("main thread sleeping for 1 second...");
            Thread.Sleep(1000);
    
            Console.WriteLine("main thread signaling worker thread...");
            autoEvent.Set();
        }
    }
    
    msdn'den ornek kod. bu da link


    ..
  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    mstraker
    mstraker's avatar
    Kayıt Tarihi: 11/Haziran/2007
    Erkek

    Hocam tamam da benim sorunum elimdeki veri nesne değil, dizi. Mesela düşün "string[] dizi". bu dizinin boyutu değiştiğinde nasıl tetikleyeceğimi koda dökemiyorum. Buton olsa click'i alırsın falan filan. Bu dizide tetiklemeyi ne yapıcak nasıl yapacak


    what makes you think i am not?
  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Destroyer
    Destroyer's avatar
    Kayıt Tarihi: 27/Eylül/2003
    Erkek

    "Ne zamanki dizi boyutu değişti ...." dediğin noktaya odaklanırsak şunun aşikar olduğunu sen de kabul edersin.

    1. C#'ta nesnelere Listener eklenebiliyorsa (ki ben bilmiyorum ve zannetmiyorum)

    Nesneye eklediğin Listener içerisinde dizinin boyutunun değiştiğini algılarsın ve thread.interrupt() gibi bir kod ile bahsettiğin Thread'i tetiklersin.

     

    2. C#'ta nesnelere Listener eklenemiyorsa

    Bu dizinin boyu mutlaka ve sadece programın herhangi bir yerinde çağırılan bir kod ile değişir. Metafiziksel varlıkların değiştirecek hali yok. İşte o kodun çağırıldığı yerin hemen altında thread.interrupt() koduyla bahsettiğin Thread'i tetiklersin.

     

    NOT: C# syntaxı bilmiyorum o yüzden "thread.interrupt()" dediğim kod geçerli olmayabilir ama mantık interrupt mantığıdır.


    d.d.
  7. KısayolKısayol reportŞikayet pmÖzel Mesaj
    mstraker
    mstraker's avatar
    Kayıt Tarihi: 11/Haziran/2007
    Erkek

    Destroyer bunu yazdı:
    -----------------------------

    "Ne zamanki dizi boyutu değişti ...." dediğin noktaya odaklanırsak şunun aşikar olduğunu sen de kabul edersin.

    1. C#'ta nesnelere Listener eklenebiliyorsa (ki ben bilmiyorum ve zannetmiyorum)

    Nesneye eklediğin Listener içerisinde dizinin boyutunun değiştiğini algılarsın ve thread.interrupt() gibi bir kod ile bahsettiğin Thread'i tetiklersin.

     

    2. C#'ta nesnelere Listener eklenemiyorsa

    Bu dizinin boyu mutlaka ve sadece programın herhangi bir yerinde çağırılan bir kod ile değişir. Metafiziksel varlıkların değiştirecek hali yok. İşte o kodun çağırıldığı yerin hemen altında thread.interrupt() koduyla bahsettiğin Thread'i tetiklersin.

     

    NOT: C# syntaxı bilmiyorum o yüzden "thread.interrupt()" dediğim kod geçerli olmayabilir ama mantık interrupt mantığıdır.


    -----------------------------

    Kardeşim valla benim de takıldığım kısım zaten senin 1. açıklamadaki parantez içi :) nesnelere listener eklenebiliyor mu? Ama şimdilik 2. şıkkını denemeye çalışayım o da çok mantıklı.


    what makes you think i am not?
  8. KısayolKısayol reportŞikayet pmÖzel Mesaj
    SharpShooter
    SharpShooter's avatar
    Banlanmış Üye
    Kayıt Tarihi: 10/Temmuz/2008
    Erkek

    kendi dizini oluşturacaksın hocam,

    bi class aç,kendi listini oluşturmak için IList interface'inden türet ve implement et,orada zaten metodlar gelecek mesela insert metodunda diziye eleman eklemenin yanında birde istediğin gibi thred çalıştırabilirsin yani diziye bir veri eklendiğini yakalaybilirsin,remove metodu falanda var biraz uğraş bakalım :)


    - xx yerde hata var. - ya aslında kod şöyle sanıyor olabilir bla bla bla - olm kendine gel kodlar düşünmez - ...
  9. KısayolKısayol reportŞikayet pmÖzel Mesaj
    tagext
    tagext's avatar
    Üstün Hizmet Madalyası Başarı Madalyası
    Kayıt Tarihi: 25/Temmuz/2002
    Erkek

    dizi ne erişen fonksiyonları kendi yazacağın bir fonksiyon ile değiştir.


    ftw
  10. KısayolKısayol reportŞikayet pmÖzel Mesaj
    mstraker
    mstraker's avatar
    Kayıt Tarihi: 11/Haziran/2007
    Erkek

    Proje yetiştirme telaşından bu olay bugün yarım kaldı.Yarın geceye kadar çözücem. Önerileri de deneyeceğim sonuçları burdan bildiririm


    what makes you think i am not?
  11. KısayolKısayol reportŞikayet pmÖzel Mesaj
    guru
    guru's avatar
    Kayıt Tarihi: 30/Mart/2007
    Erkek

    al kardesim, can skntisina yazdim bisyler.

    2 sn'de bir kolon degistiren sayisal loto programi :)

    iki thread ile uretici-tuketici problemi ;-). bir thread veriyi koyar, digeri ise veriyi isler... bu boyle surer gider.

    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 WindowsFormsApplication1
    {
        public partial class Form2 : Form
        {
            private int[] m_numbers = new int[6];
            private AutoResetEvent m_areSync1 = new AutoResetEvent(false);
            private AutoResetEvent m_areSync0 = new AutoResetEvent(true);
            private delegate void delRefresh();

            public Form2()
            {
                InitializeComponent();
                MyInitialize();
            }

            private void MyInitialize()
            {
                ThreadPool.QueueUserWorkItem(new WaitCallback(thrChangeList));
                ThreadPool.QueueUserWorkItem(new WaitCallback(thrRefreshListbox));
            }



            private void thrRefreshListbox(object obj)
            {
                delRefresh refresh = new delRefresh(RefreshListbox);
                for (; ; )
                {
                    /* global alana veri koyuldumu ? koyulmadiysa bloke ol*/
                    m_areSync1.WaitOne();

                    Array.Sort(m_numbers);

                    /*listbox'a yazdirma islemleri*/
                    this.Invoke(refresh);

                    /*global alandaki verinin islendi.*/
                    m_areSync0.Set();
                }
            }

            private void thrChangeList(object obj)
            {
               
                for (; ; Thread.Sleep(2000))
                {
                    /*veri islenmis mi ? islenmediyse blokeye sebep ol*/
                    m_areSync0.WaitOne();

                    FillListUniqueNumbers();

                    /*global veri yenilendi*/
                    m_areSync1.Set();
                }
            }

            private void RefreshListbox()
            {
                this.numbersListbox.Items.Clear();
                for (int i = 0; i < 6; ++i)
                {
                    this.numbersListbox.Items.Add(m_numbers[i]);
                }
            }

            private void FillListUniqueNumbers()
            {
                int i, j, nmb;
                Random rnd = new Random((int)DateTime.Now.Ticks);
                for (i = 0; i < 6; ++i)
                {
                AGAIN:
                    nmb = rnd.Next(1, 60);
                    for (j = i; j > 0; --j)
                    {
                        if (nmb == m_numbers[j])
                            goto AGAIN;
                    }
                    m_numbers[i] = nmb;
                }
            }
        }
    }


    ..
Toplam Hit: 3972 Toplam Mesaj: 14