none
Progress-окно RRS feed

  • Вопрос

  • Всем добрый день! Хотел в своём проекте, реализовать своё status-окно, которое появляется при обработке/запросе каких-либо данных. Например: при заполнении формы, пользователь нажимает кнопку ОК, поверх текущей формы открывается маленькое окошко, где описываются текущие выполняемые действия("Выполняется отправка...", "Проверка данных в ЦБД..." и т.п.). Уже пробовал реализовать это, но когда программа отправляет например почту, она "виснет", и никакого status-текста, тем более progress-бара не видно:(.

    • Перемещено Tagore Bandlamudi 2 октября 2010 г. 21:24 MSDN Forums consolidation (От:Разработка Windows-приложений)
    2 июля 2010 г. 11:40

Ответы

  • Нужно в разных потоках выполнять основную работу и выводить сообщения.

    Это в основной форме:

          InfoForm f = new InfoForm();
          Thread t = new Thread(delegate()
          {
            f.ShowDialog();
          });
          t.Start();
          f.SetInfo("AAAAA");
          Thread.Sleep(1000);
          f.SetInfo("BBBBBB");
          Thread.Sleep(1000);
          f.SetInfo("CCCCCC");
    

    Это в форме отображающей сообщения:

        public void SetInfo(string s)
        {
          if (this.InvokeRequired)
          {
            this.Invoke(new MethodInvoker(delegate() { this.label1.Text = s; }));
          }
          else
          {
            this.label1.Text = s; 
          }
        }

    • Помечено в качестве ответа I.Vorontsov 2 июля 2010 г. 12:57
    • Снята пометка об ответе _CRBA_ 2 июля 2010 г. 13:22
    • Помечено в качестве ответа _CRBA_ 2 июля 2010 г. 13:22
    2 июля 2010 г. 12:41
    Модератор

Все ответы

  • Так попробуйте Statusbar - он для этого и предназначен.
    2 июля 2010 г. 12:05
  • Нужно в разных потоках выполнять основную работу и выводить сообщения.

    Это в основной форме:

          InfoForm f = new InfoForm();
          Thread t = new Thread(delegate()
          {
            f.ShowDialog();
          });
          t.Start();
          f.SetInfo("AAAAA");
          Thread.Sleep(1000);
          f.SetInfo("BBBBBB");
          Thread.Sleep(1000);
          f.SetInfo("CCCCCC");
    

    Это в форме отображающей сообщения:

        public void SetInfo(string s)
        {
          if (this.InvokeRequired)
          {
            this.Invoke(new MethodInvoker(delegate() { this.label1.Text = s; }));
          }
          else
          {
            this.label1.Text = s; 
          }
        }

    • Помечено в качестве ответа I.Vorontsov 2 июля 2010 г. 12:57
    • Снята пометка об ответе _CRBA_ 2 июля 2010 г. 13:22
    • Помечено в качестве ответа _CRBA_ 2 июля 2010 г. 13:22
    2 июля 2010 г. 12:41
    Модератор
  • Спасибо за ответ, вполне доходчиво, и думаю реализуемо. Раньше уже видел возможность многопоточности, но не смог самостоятельно реализовать.

    Осталось только на VB.NET перевести, если кто сможет буду признателен, а так попытаюсь сам.

    2 июля 2010 г. 13:20