c # формы блокируют другой элемент управления, когда вызывается диалог show - PullRequest
0 голосов
/ 15 марта 2012

Когда загружается мое приложение. Я отображаю индикатор выполнения, используя код ниже. Проблема в том, что если кто-то нажмет на контекстное меню панели инструментов (способ выхода), оно будет заблокировано, пока не будет закрыта индикатор выполнения. Кто-нибудь знает лучший способ достижения этого?

Причина, по которой я использую ShowDialog, заключается в том, что при использовании Show индикатор выполнения не анимируется - я использую MarqueeStyle.

Спасибо

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();
        }
    }

Ответы [ 2 ]

2 голосов
/ 15 марта 2012

Этот код выглядит не совсем правильно. Вы уверены, что это не вызывает перекрестные нарушения? В общем, вся ваша метафора здесь неверна. Вы должны держать GUI в потоке GUI. Загрузите приложение в фоновом потоке и отправьте ему обновления прогресса в поток графического интерфейса.

1 голос
/ 15 марта 2012

Ваша форма PopupProgressBar не должна отвечать за загрузку себя в новый поток, что должно быть сделано в предположительно вашем главном окне.

Я бы избавился от всего материала потока в PopupProgressBar и сделал бы его простоначать обновление это шатер.Затем в главном окне (OnLoad) вы говорите, чтобы он сделал это:

        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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...