Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Окно ожидания


Автор: HAL707 11.8.2009, 16:46
Привет всем.

Хотелось бы спросить, как правильно создать окно ожидания длительно опрерации главной формы?
То есть есть конструктор главной формы
Код

MainForm()
{
WaitForm.Show() //хотелось бы нечто типа класса WaitForm, который показывает и убирает окно ожидания, когда это нужно

//длительная операция

WaitForm.Close()

}


Кто-то делал нечто подобное?

Автор: Bogdan1024 11.8.2009, 16:59
Думаю тебе просто нужно выполнять длительную операцию в отдельном потоке.

Автор: Raistlin 11.8.2009, 21:10
Почитай насчет BackgroundWorker и System.Threading.Thread, готовых примеров с подобными окнами, прогрессбарами и т.п. очень много smile

Автор: HAL707 12.8.2009, 10:24
Если бы все было так просто...
Создаю форму в отдельном потоке. Форма не показывается.
Делаю так:
Код

 protected override void OnLoad(EventArgs e)
{
            new Thread(new ThreadStart
                (
                delegate
                {
                    frmWait wf = new frmWait();
                    wf.TopMost = true;
                    wf.Show();
                }
                )).Start();

//длительная операция
}


Invoke методы главной формы я тоже не могу вызывать, поскольку ко временни вызова не создан дескриптор главного окна.
Так как показать фому ожидания?

Автор: diadiavova 12.8.2009, 10:43
Цитата(HAL707 @  12.8.2009,  11:24 Найти цитируемый пост)
Создаю форму в отдельном потоке. Форма не показывается.

В отдельном потоке надо не форму запускать, а выполнять операцию, завершения которой ты ожидаешь, показывая эту форму.

Автор: kobra 19.8.2009, 13:39
например так 
Код

class WaitClass
    {
        public Thread WaitFormThread = new Thread(new ThreadStart(WaitFormShow));

        private static void WaitFormShow()
        {
            System.Windows.Forms.Form f = new System.Windows.Forms.Form();
            f.ShowInTaskbar = false;
            f.Height = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Height / 50;
            f.Width = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Width / 3;
            f.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
            f.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
            System.Windows.Forms.ProgressBar pb = new System.Windows.Forms.ProgressBar();
            pb.Style = System.Windows.Forms.ProgressBarStyle.Marquee;
            f.Controls.Add(pb);
            pb.Dock = System.Windows.Forms.DockStyle.Fill;
            pb.Step = 5;
            f.ShowDialog();
        }
    }
вызов и закрытие
Код

                WaitClass Wait = new WaitClass();
                Wait.WaitFormThread.Start();
               ...
                Wait.WaitFormThread.Abort();


Автор: Sharic 22.9.2009, 06:52
А как сделать это окошко модальным?

Автор: Sharic 23.9.2009, 07:41
У меня такая проблема:
на форме лежит контрол ReportView, у него есть метод RefreshReport, который выполняется довольно долго. 
Так как это метод контрола, я не могу переместить эту операцию в другой поток. 
Вопрос: Как во время выполнения рефреш репорт в основном потоке показать модальное окошко с прогресбаром в другом потоке?

Автор: kobra 24.9.2009, 11:30
Цитата(Sharic @  23.9.2009,  07:41 Найти цитируемый пост)
Вопрос: Как во время выполнения рефреш репорт в основном потоке показать модальное окошко с прогресбаром в другом потоке? 

посмотри код чуть выше

Автор: Sharic 24.9.2009, 12:51
Окно из кода не модальное...

Автор: kobra 24.9.2009, 13:41
Цитата(Sharic @  24.9.2009,  12:51 Найти цитируемый пост)
Окно из кода не модальное... 
Цитата(kobra @  19.8.2009,  13:39 Найти цитируемый пост)
f.ShowDialog();

но он в другом патоке smile

Автор: Sharic 24.9.2009, 14:49
Теряется весь смысл этого окошка.
Что хотелось: в основном потоке идет обновление контрола (достаточно долго) и во время этого показывается модальное окошко с прогрессом,
чтобы пользователь не думал, что приложение висит и не тыкался по всей форме, что может привести к отмене генерации отчета.
Отдельно болтающееся окошко - это не очень здорово.
Хотя свою проблему решил, но немного по-другому.

Автор: kobra 24.9.2009, 15:09
Цитата(Sharic @  24.9.2009,  14:49 Найти цитируемый пост)
Хотя свою проблему решил, но немного по-другому. 

а показать?

Автор: Sharic 28.9.2009, 11:38
Решение получилось не в создании какого-то хитрого окна, а в работе самого контрола ReportViewer. 
Если кому интересно, могу объяснить, а так не по теме получается.

Автор: Ciminance 24.10.2022, 03:55
Модератор: Сообщение скрыто.

Автор: Queuego 4.11.2022, 22:22
Модератор: Сообщение скрыто.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)