• 30-10-2019, 21:20:32
    #1
    Bir sistem yazdım.

    İşlem sırasında iken yazılımın donmamasını istiyorum. Bunu Async ve Thread ila halledebiliyorum. Fakat for ile yapınca durdur devam et gibi şeyler yapamıyorum.

    Timer ile yapayım dedim, durdur başlat olayı iyi olur dedim. Sırası ile açacağına thread veya async start verdiğiniz anda timer çalıştıka açıyor. Thread da lock ettim fakat bu seferde hata veriyor bir müddet sonra.

    Bana işlem yapılırken yazılım donmayacak, durdur başlat yapabileceğim bir öneri lazım. Var ise böyle bir öneriniz, çok minnet duyarım.

    (Form Application Geliştiriyorum)
  • 30-10-2019, 22:12:47
    #2
    AOK
    Google Haritalar Uzmanı
    Her on işlemden yada 20 işlemden sonra 3 saniye durdur sonra başlatsanız olmuyor mu ? Hem belirli işlemden sonra durur rahatlatır hem de hızlı olur daha az kod olur
  • 30-10-2019, 22:51:56
    #3
    BackgroundWorker nesnesi ile kolayca yapabilirsiniz. Visual Studio Toolbox içindeki components kısmında BackgroundWorker nesnesini alıp forma sürükleyin.
    daha sonra global bir değişken tanımlayın :

    bool isStop=false;

    daha sonra durdurma butonunun click eventine şu şekilde bir kod ekleyin :

    private void btnDurdur_Click(object sender, EventArgs e)
    {
    // meşgül değilse gerek yok işleme pas geçiyoruz
    if (!backgroundWorker1.IsBusy)
    {
    return;
    }

    Button btn= sender as Button;
    btn.Enable=false;
    isStop=true;
    }

    daha sonra DoWork methodu içine şu şekilde bir kontrol yerleştirin :

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
    // sizin döngünüzün başına böyle bir if yerleştirin.
    while(true)
    {
    if (isStop)
    {
    break;
    }
    // uzun kodların çalıştığı blok
    }
    }

    daha sonra RunWorkerCompleted methodu içinde durdurma butonunu ve global değişkeni restore edin

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
    isStop=false;
    btndurdur.Enable=true;
    }
  • 30-10-2019, 22:56:31
    #4
    mpurvis adlı üyeden alıntı: mesajı görüntüle
    BackgroundWorker nesnesi ile kolayca yapabilirsiniz. Visual Studio Toolbox içindeki components kısmında BackgroundWorker nesnesini alıp forma sürükleyin.
    daha sonra global bir değişken tanımlayın :

    bool isStop=false;

    daha sonra durdurma butonunun click eventine şu şekilde bir kod ekleyin :

    private void btnDurdur_Click(object sender, EventArgs e)
    {
    // meşgül değilse gerek yok işleme pas geçiyoruz
    if (!backgroundWorker1.IsBusy)
    {
    return;
    }

    Button btn= sender as Button;
    btn.Enable=false;
    isStop=true;
    }

    daha sonra DoWork methodu içine şu şekilde bir kontrol yerleştirin :

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
    // sizin döngünüzün başına böyle bir if yerleştirin.
    while(true)
    {
    if (isStop)
    {
    break;
    }
    // uzun kodların çalıştığı blok
    }
    }

    daha sonra RunWorkerCompleted methodu içinde durdurma butonunu ve global değişkeni restore edin

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
    isStop=false;
    btndurdur.Enable=true;
    }
    Teşekkür ederim. BackGroundWorker bakmıştım. Yapısını ters bulduğum için fazla girmemiştim o konuya. Dediğinizi deneyeceğim, tekrardan teşekkür ederim.
  • 31-10-2019, 01:33:40
    #5
    mustafadgr adlı üyeden alıntı: mesajı görüntüle
    Teşekkür ederim. BackGroundWorker bakmıştım. Yapısını ters bulduğum için fazla girmemiştim o konuya. Dediğinizi deneyeceğim, tekrardan teşekkür ederim.
    rica ederim bgworker windows form için tasarlandığından gönül rahatlığıyla kullanabilirsiniz. aynı işlemi Task sınıfı ile de yapabilirsiniz. küçük bir senkronizasyon eklemesi ile. işte örnek :
            bool isStop = false;
            private void btnDurdur_Click(object sender, EventArgs e)
            {
                btnDurdur.Enable = false;
                btnDurdur.Text = "Bekleyiniz ...";
                isStop = true;
            }
          
            private void arkaPlan()
            {
                Task task = Task.Factory.StartNew(() =>
                {
                    // while ya da for sizin döngünüz
                    while (true)
                    {
                        if (isStop)
                        {
                            break;
                        }
    
                        // burda yapılan her işlemden sonra yine  if (isStop) kontrolü edilebilir.
                        // amaç her işlemden sonra mutlaka isStop u kontrol etmek.
                        // zira burdaki işlem bitmeden isStop kontrol edilmeyeceği için durdurma işlemi işin bitişine göre değişkenlik gösterecektir.
                    }
                }).ContinueWith((t) =>
                {
                    // burası UI güvenli bölge yani ana uygulama thread bölgesi.
                    btnDurdur.Enable = true;
                    btnDurdur.Text = "DURDUR";
                    isStop = false;
                }, TaskScheduler.FromCurrentSynchronizationContext());
            }
  • 31-10-2019, 18:49:38
    #6
    mpurvis adlı üyeden alıntı: mesajı görüntüle
    rica ederim bgworker windows form için tasarlandığından gönül rahatlığıyla kullanabilirsiniz. aynı işlemi Task sınıfı ile de yapabilirsiniz. küçük bir senkronizasyon eklemesi ile. işte örnek :
            bool isStop = false;
            private void btnDurdur_Click(object sender, EventArgs e)
            {
                btnDurdur.Enable = false;
                btnDurdur.Text = "Bekleyiniz ...";
                isStop = true;
            }
          
            private void arkaPlan()
            {
                Task task = Task.Factory.StartNew(() =>
                {
                    // while ya da for sizin döngünüz
                    while (true)
                    {
                        if (isStop)
                        {
                            break;
                        }
    
                        // burda yapılan her işlemden sonra yine  if (isStop) kontrolü edilebilir.
                        // amaç her işlemden sonra mutlaka isStop u kontrol etmek.
                        // zira burdaki işlem bitmeden isStop kontrol edilmeyeceği için durdurma işlemi işin bitişine göre değişkenlik gösterecektir.
                    }
                }).ContinueWith((t) =>
                {
                    // burası UI güvenli bölge yani ana uygulama thread bölgesi.
                    btnDurdur.Enable = true;
                    btnDurdur.Text = "DURDUR";
                    isStop = false;
                }, TaskScheduler.FromCurrentSynchronizationContext());
            }
    Bunu diğer yöntemler ile de yapabiliriz,durdurup kaldığı yerden devam etmesini sağlamam lazım. Sanırım bu şekilde kontrol sağlayarak yapmak gerek. Başka çare yok
  • 31-10-2019, 21:18:55
    #7
    mustafadgr adlı üyeden alıntı: mesajı görüntüle
    Bunu diğer yöntemler ile de yapabiliriz,durdurup kaldığı yerden devam etmesini sağlamam lazım. Sanırım bu şekilde kontrol sağlayarak yapmak gerek. Başka çare yok
    hocam otomatik belli bir süre bekleyip sonra devam etmesini mi istiyorsunuz? yoksa programi durdurup kapattiktan sonra tekrar açılınca kaldığı yerden çalışmasını mı?
  • 31-10-2019, 21:20:57
    #8
    mpurvis adlı üyeden alıntı: mesajı görüntüle
    hocam otomatik belli bir süre bekleyip sonra devam etmesini mi istiyorsunuz? yoksa programi durdurup kapattiktan sonra tekrar açılınca kaldığı yerden çalışmasını mı?
    İşlem yaparken döngüden çıkmadan duracak, devam et dediğimizde kaldığı yerden devam edecek.
  • 31-10-2019, 22:27:00
    #9
    mustafadgr adlı üyeden alıntı: mesajı görüntüle
    İşlem yaparken döngüden çıkmadan duracak, devam et dediğimizde kaldığı yerden devam edecek.
    o zaman thread sleep yaparsaniz döngü icinde olur. ana ui thread i olmadığı için arka planda kendi kanalinda bekler. döngü içine bu şekilde bir ekleme yaparsaniz işleminiz askida bekler sure dolunca devam eder.
    Thread.Sleep(2000);