• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[C# WinForms] Robieni innych rzeczy podczas trwania pętli

VPS Starter Arubacloud
+1 głos
653 wizyt
pytanie zadane 2 września 2016 w C# przez Stami Gaduła (3,790 p.)

Witam mam problem. Przedstawię go na podstawie progres bara. A więc napisałem króciutki program:

private void start_Click(object sender, EventArgs e) //przycisk startu
        {
            int progres = 0;
            while(progres != 100)
            {
                progressBar.Value = progres; //ustawianie progres bar'a
                progres++;
                System.Threading.Thread.Sleep(1000);
            }
        }

        private void stop_Click(object sender, EventArgs e) //przycisk stopu
        {
            MessageBox.Show("Zatrzymano");
        }

Działa bardzo prosto. Jednak problem jest w tym, że nie wiem jak zrobić żeby po uruchomieniu pętli (progres bara) można było kliknąć przycisk stop.

1 odpowiedź

+1 głos
odpowiedź 3 września 2016 przez marcink Początkujący (390 p.)
edycja 3 września 2016 przez marcink

Cała pętla z progress barem powinna być w uruchomiona w tle, czyli w innym wątku.

Skorzystaj z klasy BackgroundWorker

Operacje z pętlą wrzuć do zdarzenia DoWork.

a by uruchomić tego Workera w przycisku dodaj:

private void start_Click(object sender, EventArgs e) //przycisk startu
        {
            bgwProgressBar.RunWorkerAsync();
        }

Natomiast przycisk stop powinien sprawdzić czy proces działa, jeśli tak to go anulować, czyli:

private void stop_Click(object sender, EventArgs e) //przycisk stopu
        {
             if (bgwProgressBar.IsBusy)
              {
                  bgwProgressBar.CancelAsync();
                  MessageBox.Show("Zatrzymano");
              }
        }

 

Jeśli w takim wątku chcesz uruchomić jakąś metodę która pochodzi np. z głównego wątku aplikacji (już uruchomionego) to możesz go uruchomić poprzez:

this.Invoke(new Action(() => NazwaMetody()));

komentarz 3 września 2016 przez Stami Gaduła (3,790 p.)
Program napisałem na szybko, żeby wstawić je na forum i zadać pytanie. Tylko mam jeden mały (i zapewne głupi) problem. Nie wiem jak wywołać zdarzenie. (Do Work)
komentarz 3 września 2016 przez marcink Początkujący (390 p.)
zaktualizowałem wcześniejszą odpowiedź.

Musisz wywołać.uruchomić nowy wątek a nie to zdarzenie.

A dokładnie chodzi o .RunWorkerAsync();
komentarz 3 września 2016 przez Stami Gaduła (3,790 p.)

Wyskakuje błąd:

    'ProgressBar' does not contain a definition for 'RunWorkerAsync' and no extension method 'RunWorkerAsync' accepting a first argument of type 'ProgressBar' could be found (are you missing a using directive or an assembly reference?) 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void start_Click(object sender, EventArgs e)
        {
            progressBar.RunWorkerAsync();
        }

        private void stop_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Zatrzymano"); //To jeszcze nie ma działać :)
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            int progres = 2;
            while (progres != 100)
            {
                progressBar.Value = progres;
                progres++;
                System.Threading.Thread.Sleep(1000);
            }
        }
    }
}

 

Podobne pytania

0 głosów
0 odpowiedzi 101 wizyt
+3 głosów
0 odpowiedzi 50 wizyt
0 głosów
0 odpowiedzi 132 wizyt
pytanie zadane 3 października 2023 w C# przez Gniewomir Nowicjusz (120 p.)

92,768 zapytań

141,691 odpowiedzi

320,508 komentarzy

62,106 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...