Forma z informacją w wątku

0

Witam

W trakcie wykonywania programu, wykonują się pewne złożone operacje. Aby zasugerować użytkownikowi że coś się dzieje, lecz program nie wisie chciałem pokazać okienko z taką właśnie informacją. Niestety metoda ShowDialog wisi sama w sobie i czeka na zakończenie. Dlatego też wstawiłem ją do wątka. Niestety nie chce to zadziałać :(

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

namespace thread_test
{
    public partial class Form1 : Form
    {

        czekaj OknoCzekaj = new czekaj();

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Thread watek = new Thread(PokazCzekaj);
            watek.Start();
            
            //// TUTAJ SIE DUZO DZIEJE
            Thread.Sleep(5000);

            OknoCzekaj.Close();
        }

        private void PokazCzekaj()
        {
            OknoCzekaj.ShowDialog();
        }
    }
}

OknoCzekaj to zwyczajna formatka z informacją "proszę czekać". Niestety przy próbie jej zamknięcia pojawia się problem. Nie wiem jak wywołać we wątku metodę Close() aby wątek się zakończył i okno znikneło

0

To właśnie w wątku powinieneś umieścić kod, w którym "dużo się dzieje". Po zakończeniu obliczeń wywołujesz zdarzenie, że nastąpił koniec obliczeń.

0

Tylko że przed uruchomieniem wątku w którym się "dużo dzieje", muszę wywołać metodę ShowDialog(), która będzie wisieć dopóki nie zamknę okna i w rezultacie też nie uruchomi tego wątka

0

Chcę tylko, żeby pojawiło się dodatkowo okno z informacją a program niech sobie dalej robi co trzeba. Po przejściu tych czasochłonnych rzeczy chciał bym zamknąć to okno uruchomione w tym nowym wątku

0
namespace thread_test
{
    public partial class Form1 : Form
    {

        czekaj OknoCzekaj = new czekaj();

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            OknoCzekaj.ShowDialog();

            Thread watek = new Thread(DlugieObliczenia);
            watek.Start();
        }

        private void DlugieObliczenia()
        {
             //// TUTAJ SIE DUZO DZIEJE
            Thread.Sleep(5000);
   
            OknoCzekaj.Close();
        }
    }
}

Tak to powinno mniej więcej wyglądać. Tylko pewnie wyskoczy Ci wyjątek o dostępie do obiektu OknoCzekaj z innego wątku, dlatego poczytaj o metodzie Invoke().

0
        private void button1_Click(object sender, EventArgs e)
        {
            OknoCzekaj.ShowDialog(); ////// tutaj aplikacja stanie i nigdy nie uruchomi watka DlugieObliczenia

            Thread watek = new Thread(DlugieObliczenia);
            watek.Start();
        }

OknoCzekaj.ShowDialog() tu się zatrzyma z otwartą formatką. A ma ją wyświetlić i przejść dalej

Chodzi o to żeby metoda ShowDialog() nie była blokująca

0

Próbowałeś zrobić Show()?

0

Niestety metoda Show() okna nie pokazuje. Mam wrażenie że tylko mignie na ekranie i znika gdzieś razem z wątkiem. Zobaczę co można zrobić z tą funkcją Invoke().

        private void button1_Click(object sender, EventArgs e)
        {
            Thread watek = new Thread(PokazCzekaj);
            watek.Start();

            //// TUTAJ SIE DUZO DZIEJE
            Thread.Sleep(5000);

            OknoCzekaj.Close();
        }

To właściwie działa do momentu OknoCzekaj.Close(), ponieważ próbuje je zamknąć z innego wątka niż zostało pokazane

0

Rozwiązałem :)

Formatka z informacją:

namespace thread_test
{
    public partial class czekaj : Form
    {
        public czekaj()
        {
            InitializeComponent();
        }

        public void Zamknij()
        {
            Close();
        }
    }
}

Główny program:

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

namespace thread_test
{
    public partial class Form1 : Form
    {

        czekaj OknoCzekaj = new czekaj();

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Thread watek = new Thread(PokazCzekaj);
            watek.Start();

            //// TUTAJ SIE DUZO DZIEJE
            Thread.Sleep(5000);

            OknoCzekaj.Invoke(new MethodInvoker(OknoCzekaj.Zamknij));
        }

        private void PokazCzekaj()
        {
            OknoCzekaj.ShowDialog();
        }
    }
}
0
    public partial class Form1 : Form
    {

        czekaj OknoCzekaj = new czekaj();

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Thread watek = new Thread(DlugieObliczenia);
            watek.Start();
            OknoCzekaj.ShowDialog();
        }

        private void DlugieObliczenia()
        {
            //// TUTAJ SIE DUZO DZIEJE
            Thread.Sleep(5000);

            OknoCzekaj.Invoke(new MethodInvoker(OknoCzekaj.Close));
        }
    }
0

sirmrowa: posłuchaj kolegów i umieść czasochłonne operacje w drugim wątku, główny pozostawiając do obsługi GUI. Kod już dostałeś.

1 użytkowników online, w tym zalogowanych: 0, gości: 1