• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 231
  • Last Modified:

Code run - after instantiate GUI-Controls in Thread - is not executed ???

Hello

I have 2 Form. In the MainWindow I start a thread which creates the second Form -ProgressWindow - and I try to set a value in the ProgressBar but nothings happens, WHY?

I get no exception just nothing happens after the Dialog is shown.
FORM_1:
 
public partial class MainWindow : Form
    {
        public MainWindow()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            var myThread = new Thread(Calculate_Tread);
            myThread.Start();
        }
 
        public void Calculate_Tread()
        {
            var myProgressWindow = new ProgressWindow();
            myProgressWindow.ShowDialog();
            Console.WriteLine("code after ShowDialog");
            myProgressWindow.SetValue(80);
 
        }
    }
 
FORM_2:
 
public partial class ProgressWindow : Form
    {
        public ProgressWindow()
        {
            InitializeComponent();
        }
 
        public void SetValue(int value)
        {
            progressBar1.Value = value;
        }
    }

Open in new window

0
MSFanboy
Asked:
MSFanboy
  • 3
1 Solution
 
somnaticCommented:
Might be because you are calling a GUI object from within another thread (though you whould get an exception). Try using a BackgroundWorker and the according events.
0
 
MSFanboyAuthor Commented:
I call the GUI object from the thread it was created so there should NOT be a problem and if there would be the typical problem I would get such a message:
"The calling thread cannot access this object because a different thread owns it."

But I did NOT get such a message! To make sure 100% I even invoked the whole creation of the progresswindow object and there is no difference...
Backgroundworker sucks and I have already implemented my threads so I do NOT want to refactor whole code. Til now I havent had any problems with gui access and threads only now its the first time that I have outsourced my progressbar in another Form instead of using the progressBar in the Form where the thread runs.
0
 
MSFanboyAuthor Commented:
one thing I found out is that form.ShowDialog() is blocking the thread somehow because if I use form.Show() the code after its call is executed.
Someone knows more?
0
 
MSFanboyAuthor Commented:
above is my solution

using System;
using System.Threading;
using System.Windows.Forms;
 
namespace ThreadTest
{
    public partial class MainWindow : Form
    {
        /// <summary>
        /// Hält eine Instanz der Progressform-Klasse zur
        /// Darstellung während des Longrunning-Task.
        /// </summary>
        private ProgressWindow progressForm;
 
 
        /// <summary>
        /// Delegate um die ProgressForm Thread-safe zu schliesen
        /// </summary>
        delegate void CloseDialogCallback();
 
 
        public MainWindow()
        {
            InitializeComponent();
            this.progressForm = new ProgressWindow();
 
 
          
        }  
 
        /// <summary>
        /// Dummy-Job
        /// </summary>
        /// <param name="obj">
        /// Dummy-Objekt um ParameterizedThreadStart zu simulieren.
        /// </param>
        private void DoSomething(object obj)
        {
           
            {
                // 3 Sekunden im Kreis fahren
                int counter = 0;
                while (counter < 100)
                {
                    Thread.Sleep(100);
                    counter++;
 
                   this.IncreaseProgressBar();
                }
            };
                
 
 
            // Kreisfahrt fertig, Progressfenster schliesen
            this.CloseDialog();
        }
 
        private void IncreaseProgressBar()
        {
            // prüfen ob von unterschiedlichen Threads aufgerufen wird
            if (this.progressForm.InvokeRequired)
            {
                // Threads unterschiedlich, Delegaten initialisieren
                CloseDialogCallback callBack = new 
CloseDialogCallback(this.IncreaseProgressBar);
 
 
                // Delegaten asynchron, im Kontext des UI-Thread, aufrufen
                this.Invoke(callBack);
            }
            else
            {
                // jetzt asynchron im UI-Kontext das Progressfenster 
schliesen.
                this.progressForm.IncreaseValue();
            }
        }
 
 
        /// <summary>
        /// Schliest das Progress-Fenster Thread-safe
        /// </summary>
        private void CloseDialog()
        {
            // prüfen ob von unterschiedlichen Threads aufgerufen wird
            if (this.progressForm.InvokeRequired)
            {
                // Threads unterschiedlich, Delegaten initialisieren
                CloseDialogCallback callBack = new 
CloseDialogCallback(this.CloseDialog);
 
 
                // Delegaten asynchron, im Kontext des UI-Thread, aufrufen
                this.Invoke(callBack);
            }
            else
            {
                // jetzt asynchron im UI-Kontext das Progressfenster 
schliesen.
                this.progressForm.Close();
            }
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            // erst den longrunning Thread starten da die Progressform 
das UI blockiert.
            var thread = new Thread(this.DoSomething);
            thread.Start(new object());
 
 
            // Progressform anzeigen
            this.progressForm.ShowDialog(this);
        }
    }
}

Open in new window

0

Featured Post

Free Tool: SSL Checker

Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

  • 3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now