c# da kendi kronometremizi yapalım.

icehead

Uzman üye
19 Şub 2022
1,137
10
833
Covid olduktan sonra sıkılıp windows kullanmaya başladım tabi GNU-linux dan çıkıp windows kullanınca sudan çıkmış balığa döndüm.
ben saat ve dakika ile yaşayan birisiyim kitap okurken,çalışma yaparken sürekli saat veya dakika tutarım, linux da gnome-clock vardır fakat windows ta olmadığından nasıl dakika tutsam diye düşünmeye başladım sonunda kendi kronometremi neden yapmıyorum ki demedim ve bu proje ortaya çıktı.

bu proje diğer projelerden çok farklı!

evet bu proje çok farklı zira içerisinde garable collection,thread kullanıldı isterseniz bunlar nedir bahsedelim.

Thread nedir?​

Aslında basitce açıklarsak process'in altındaki alt processler diyebiliriz bunu bir el gibi düşünün thread ise parmaklardır yani bir process altında bir çok işlemi yapabilirsiniz bu programda da bu kullanılmıştır eğer thread olmasa idi ne olurdu? forum donardı,butonlar çalışmazdı yani özetle sorun yaşardık.
Thread ile ilgili birkaç öenek verirsek misal bir ftp programını düşünün eğer thread kullanılmaz ise ilk giren kullanıcının işini bitirmesi beklenirdi veya rat yazdığınızı hayal edin socket dolu ise sadece 1 kullanıcıya hizmet verirsiniz.
Görsel örnek:
main-qimg-2c73fa9acc65fdb30969b25bcb9da52a



Garable collection nedir?​


bunuda basit bir şekilde anlatacak olursak ram bellek üzerinde kullanılmayan objeleri temizlemekle yükümlüdür yani ram belleğin şişmesini engeller.

1*1AZ3oSPWII-9sryKRt2u1w.png



Kaynak kodlar:​

Sadece 2 buton,2 label ekleyin ve birde contectmenu kodlar aşağıdadır.
C#:
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 kronometrem
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        byte saniye = 0;
       int dakika=0;
        /*burada saniye'yi byte cinsinden almam saniye yi 1-60 arasında ihtiyacım olmasındandır, dakika konusu ise byte olamaz eğer kullanan kişi 255 sayısını dakika da geçerse overflow hatası alacaktır ve program -255 den başlar bu yüzden int en iyidir.*/

        public void kronometre_baslat()
        {
           while(true) /*sonsuz döngüye al*/
            {
                Thread.Sleep(1000); /*1 saniye uyut*/
              
                if (saniye == 60) /*saniye 60 olduysa*/
                {
                    saniye = 0; /*sıfırla*/
                    dakika++; /*dakikayı bir attır*/
                    dakika_yaz(Convert.ToString(dakika));
                    GC.Collect(); /*çöpleri topla */


                }
                else
                {
                    saniye++; /*saniye ye 1 ekle*/
                }

            }
        }

        private void dakika_yaz(string saat) /*dakika kısmı*/
        {
            if (this.InvokeRequired) /*foruma başka kaynaktan istek geliyor mu?*/
            {
                hafizaya_al yeni = new hafizaya_al(dakika_yaz); /*vcarsa gerekli işlemi yap */
                this.Invoke(yeni, new object[] { saat });

            }
            else

            {
              
                this.label2.Text = Convert.ToString(saat); /*saati yaz*/
                GC.Collect(); /*çöpleri topla */

            }

        }



         delegate void hafizaya_al(string dakika);
        Thread islem; /*iplik oluşturacağımız kısım*/

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                islem = new Thread(kronometre_baslat);
                islem.Priority = ThreadPriority.Lowest; /*işlemciyi en az şekilde rahatsız etmesi için lowest seviyesinde başla*/;
                islem.Start(); /*işlemi başlat*/

                MessageBox.Show("Kronometre başlatılmıştır!", "Kronometrem", MessageBoxButtons.OK);

            }
            catch( Exception hata)
            {
                MessageBox.Show(hata.ToString());
            }

        }

        private void button2_Click(object sender, EventArgs e)
        {
            islem.Abort(); /*işlemi sonlandır*/
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            e.Cancel = false;
            islem.Abort(); /*işlemi sonlandır*/
        }

      

        private void şuanSaniyeKaçToolStripMenuItem_Click_1(object sender, EventArgs e)
        {
            MessageBox.Show("şuan saniye: " + Convert.ToString(saniye));
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        
    }
}
 

icehead

Uzman üye
19 Şub 2022
1,137
10
833
Bakın bu kodlar çok önemli arkadaşlar basit ama ne yapılır bunlardan demeyin kafayı çalıştırın
ileride socket programlaya çalıştıklarında çok işlerine yarayacak
thread gerçektende can kurtarıyor eğer onu değilde timer kullansaydık ya forum donardı yada butonlar çalışmazdı(timer aktif olduğunda)
 

alexandre20

Katılımcı Üye
13 Tem 2022
908
11
715
dotnet'e yenisiniz galiba. Çok nadir durumlarda GC.Collect kullanılır. Garbage collection zaten runtime sırasında otomatik olarak yapılır, ram falan şişmez merak etmeyin :) Ayrıca bu proje için thread'e vs gerek yok. Interval'i 1000ms olan bir timer içine counter koyarsınız olur biter.
 

Maveraün Nehr

Blue Expert / Head of Malware Team
25 Haz 2021
981
2
1,890
41.303921, -81.901693
dotnet'e yenisiniz galiba. Çok nadir durumlarda GC.Collect kullanılır. Garbage collection zaten runtime sırasında otomatik olarak yapılır, ram falan şişmez merak etmeyin :) Ayrıca bu proje için thread'e vs gerek yok. Interval'i 1000ms olan bir timer içine counter koyarsınız olur biter.
Amaç timer kullanmamak. Aklınızda bir kod varsa görmek isterim
 

icehead

Uzman üye
19 Şub 2022
1,137
10
833
dotnet'e yenisiniz galiba. Çok nadir durumlarda GC.Collect kullanılır. Garbage collection zaten runtime sırasında otomatik olarak yapılır, ram falan şişmez merak etmeyin :) Ayrıca bu proje için thread'e vs gerek yok. Interval'i 1000ms olan bir timer içine counter koyarsınız olur biter.
"GC otomatik başlar neden kullanıyorsun?" bunu herkes sorar aslında bu mantık şu sözün programcıya yedirilmesinden oluyor "İyi programcı tembel olandır."
ben bu söze takılmamakla birlikte gc siz programı yazdığımda ram kullanımının dk geçtikçe yükseldiğini gördüm yer yer 100 mb sırını aştı.
timer kullanmama sebebime gelirsek timer click olduğunda forum kasar,butonlara tıklayamazsın.

dotnet'e yenisiniz galiba. Çok nadir durumlarda GC.Collect kullanılır. Garbage collection zaten runtime sırasında otomatik olarak yapılır, ram falan şişmez merak etmeyin :) Ayrıca bu proje için thread'e vs gerek yok. Interval'i 1000ms olan bir timer içine counter koyarsınız olur biter.
bak sana from kilitlenmesine bir örnek.
iki buton ekle projene şu verdiğim kodu buton1 e koy diğerinede basit bir messagebox ekle.

C#:
 int a = 0;
            while(true)
            {
                a++;
            }

eğer buton 1 e tıklarsan buton 2 ye asla tıklayamazsın çünki process while de boğulacaktır.
timer olayıda basit bir çözüm ama kullanıcı tam o sırada from'a dönerse kasma ile karşılaşacaktır.
 

Maveraün Nehr

Blue Expert / Head of Malware Team
25 Haz 2021
981
2
1,890
41.303921, -81.901693
İnternette görülen kodlar var birde using system timers.timer diye. Bu bir teori çünkü daha önce hiç denemedim. Bu system timers modülü sadece yazılım yüklü olan bilgisayarlar da oluyor diye düşünüyorum. Eğer ki sade bir Windows a atılınca bu kod hata verecek. Çünkü system timers modülü bu bilgisayarda yüklü değil. Doğru mu sence? Parçası bulunmayanlara da soralım. Bakalım ne diyecekler...

@sw1ndler @Endarion
 

icehead

Uzman üye
19 Şub 2022
1,137
10
833
İnternette görülen kodlar var birde using system timers.timer diye. Bu bir teori çünkü daha önce hiç denemedim. Bu system timers modülü sadece yazılım yüklü olan bilgisayarlar da oluyor diye düşünüyorum. Eğer ki sade bir Windows a atılınca bu kod hata verecek. Çünkü system timers modülü bu bilgisayarda yüklü değil. Doğru mu sence? Parçası bulunmayanlara da soralım. Bakalım ne diyecekler...

@sw1ndler @Endarion
Bilmiyorum fakat microsoft doc da böyle birşeyden bahsedilmemiş sadece .net 1.6 altı sürümlerde bu kullanılamaz diyor.
dotnet sanal bir makinada çalıştırdğı için programı hata vermesi az ihtimal ayrıca böyle birşey olsaydı illa uyarı kısmında yazardı.
 

Endarion

Katılımcı Üye
29 Ağu 2021
890
4
519
Righteous Side of Hell
İnternette görülen kodlar var birde using system timers.timer diye. Bu bir teori çünkü daha önce hiç denemedim. Bu system timers modülü sadece yazılım yüklü olan bilgisayarlar da oluyor diye düşünüyorum. Eğer ki sade bir Windows a atılınca bu kod hata verecek. Çünkü system timers modülü bu bilgisayarda yüklü değil. Doğru mu sence? Parçası bulunmayanlara da soralım. Bakalım ne diyecekler...

@sw1ndler @Endarion
Proje için teşekkürler ekledim arşive eline sağlık :).

Senin soruna gelecek olursak python gibi değil projeye kütüphane ekleme işi. Yani direkt olarak sisteme kurmuyorsun, projeye entegre ediyorsun. Bu nedenle hata vermez. Ama bilmediğim bir şey vardır affola :).
 

icehead

Uzman üye
19 Şub 2022
1,137
10
833
Proje için teşekkürler ekledim arşive eline sağlık :).

Senin soruna gelecek olursak python gibi değil projeye kütüphane ekleme işi. Yani direkt olarak sisteme kurmuyorsun, projeye entegre ediyorsun. Bu nedenle hata vermez. Ama bilmediğim bir şey vardır affola :).
rica ederim dostum iyi günlerde kullan.
bu arada threads olayını fazla yükü olan işlemlerde kullanabilirsin misal 50 saniyelik bir iş vardır bunu ye bölüp 25 sn ye indirebilirsin.
 

Endarion

Katılımcı Üye
29 Ağu 2021
890
4
519
Righteous Side of Hell
rica ederim dostum iyi günlerde kullan.
bu arada threads olayını fazla yükü olan işlemlerde kullanabilirsin misal 50 saniyelik bir iş vardır bunu ye bölüp 25 sn ye indirebilirsin.
Evet threads'i araştırmıştım bir aralar fakat zor gelmişti. Bir nevi bir işlemi tek çekirdeğe yükleyip işlemciyi zorlamaktansa 2, 3, 4 çekirdeğe bölüp hem daha hızlı hemde daha az zorlayarak yaptırmak. Öğrenilmesi gerek aslında. Bu şekilde açıklayınca çok elzem gibi geldi :D.
 

icehead

Uzman üye
19 Şub 2022
1,137
10
833
Bir challenge başlatılsa ve aynı dilde ufak bir programın farklı versiyonları yapılsa. Örneğin;

Dosya boyutu en küçük uygulama
En az bellek tüketen uygulama
En hızlı çalışan uygulama gibi
Aslında güzel olur deneyimlerimizi,hatalarımızı paylaşırız.
misal üstte olduğu gibi.
bazen hatalardan ders çıkartıp tecrübe kazanmak lazım.
 

Kruvazör

Ar-Ge Ekibi Lideri
28 Mar 2020
1,744
38
2,560
Wrong Side Of Heaven
@icehead konuya olan davetin için teşekkür ederim.
Thread yapısı ilgimi çekiyor ve araştırıyor, kullanmaya çalışıyorum.

Aynı şekilde bir projemde garbage collector yapısını da kullandım.

Konuyu tam olarak okuyamadım, daha iyi okuduğumda gerekli öneri, eleştiri, naçizane övgülerimi ileteceğim.

Eline sağlık.
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.