probably at the beach
probably at the beach

Reputation: 15227

c# forms blocking other control when show dialog called

When my application is loading. I display a progress bar using the code below. The problem is if someone clicks on the toolbar context menu (the way to exit) it will be blocked until this the progress bar is closed. Does anyone know a better way of achieving this?

The reason I'm using ShowDialog is that when I used Show the progress bar wouldn't animate - I'm using the MarqueeStyle.

Thanks

public partial class PopUpProgessBar : Form
{
    public PopUpProgessBar()
    {
        InitializeComponent();
    }

    Thread t;
    private void StartAnmiation()
    {
        this.Update();
        this.ShowDialog();
    }

    public void Stop()
    {
        if (t != null)
        { 
            t.Abort();
            t.Join();
        }
    }

    public void Start()
    {
        if (t == null)
        {
            t = new Thread(new ThreadStart(this.StartAnmiation));
            t.Start();
        }
    }

Upvotes: 0

Views: 393

Answers (2)

Brad Rem
Brad Rem

Reputation: 6026

Your PopupProgressBar form shouldn't be responsible for loading itself in a new thread, that should be done in presumably your main window.

I would get rid of all the thread stuff in PopupProgressBar and make it simply start updating it's marquee. Then, in your main window (OnLoad) you tell it to do it's thing:

        bool done = false;
        PopupProgressBar splashForm = null;
        ThreadPool.QueueUserWorkItem((x) =>
        {
            using (splashForm = new PopupProgressBar ())
            {
                splashForm.Show();
                while (!done)
                    Application.DoEvents();
                splashForm.Close();
            }
        });

        // do all your initialization work here
        // also, during each step of your initialization you could send call a function
        // in splashForm to update

        done = true;

Upvotes: 1

Brannon
Brannon

Reputation: 5424

This code doesn't look quite right. Are you sure it doesn't throw cross-thread violations? In general, your whole metaphor here is wrong. You need to keep the GUI on the GUI thread. Load your application on the background thread and have it send progress updates to the GUI thread.

Upvotes: 2

Related Questions