• 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

Object Storage Arubacloud
+1 głos
585 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 95 wizyt
0 głosów
0 odpowiedzi 86 wizyt
pytanie zadane 3 października 2023 w C# przez Gniewomir Nowicjusz (120 p.)
+1 głos
1 odpowiedź 389 wizyt
pytanie zadane 9 sierpnia 2016 w C# przez Stami Gaduła (3,790 p.)

92,555 zapytań

141,403 odpowiedzi

319,554 komentarzy

61,939 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

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!

...