none
toolStripProgressBar в потоках RRS feed

  • Вопрос

  • Такая вот проблема:

    На форме есть toolStripProgressBar1 .

    Запускаются потоки и они должны обновлять "прогрессбар", но естественно появляется ошибка мол toolStripProgressBar1 создан не в этом потоке бла бла.

    Не могу понять, как с помощью Invoke (или как то по другому) обновлять toolStripProgressBar1 в потоке ? :(

    • Перемещено Tagore Bandlamudi 1 октября 2010 г. 21:32 MSDN Forums consolidation (От:Visual C#)
    12 августа 2010 г. 9:27

Ответы

  • А. Нет, это я торможу. Ты же из отдельного класса делаешь.Тогда вот так:

      class MyThreadedClass
      {
        public MyThreadedClass()
        {
        }
    
        public void StrartWork()
        {
          Thread t = new Thread(delegate()
            {
              for (int i = 0; i < 100; i++)
              {
                Thread.Sleep(10);
                if (Application.OpenForms["Form1"].InvokeRequired)
                {
                  Application.OpenForms["Form1"].Invoke(new MethodInvoker(delegate() { ((ProgressBar)Application.OpenForms["Form1"].Controls["progressBar1"]).Value = i; }));
                }
                else
                {
                  ((ProgressBar)Application.OpenForms["Form1"].Controls["progressBar1"]).Value = i;
                }
              }
            }
    
            );
          t.Start();
        }
      }
    

    • Помечено в качестве ответа geforse 12 августа 2010 г. 11:53
    12 августа 2010 г. 11:00
    Модератор

Все ответы

  • Смотрим тут и тут .

    Делаем по аналогии.

    12 августа 2010 г. 9:33
    Модератор
  • В отдельном классе у меня есть код:

                  if (System.Windows.Forms.InvokeRequired)
                  {
                    System.Windows.Forms.Invoke(new MethodInvoker(delegate() { progressBar.Value++; }));
                  }
    
    "InvokeRequired" отсутствует в пространстве имен "System.Windows.Forms" (пропущена ссылка на сборку?)  

    using System.Windows.Forms; прописано...

    12 августа 2010 г. 10:01
  • Надо:
    if (this.InvokeRequired)
    {
    this.Invoke(new MethodInvoker(delegate() {
    progressBar.Value++; }));
    }
     
     
    12 августа 2010 г. 10:03
    Модератор
  • Пробовал)

    "................." не содержит определения для "InvokeRequired" и не был найден метод расширения "InvokeRequired", принимающий тип "................." в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку)

    12 августа 2010 г. 10:30
  • Может, действительно ссылку на сборку в проекте удалил?
    12 августа 2010 г. 10:41
    Модератор
  • А. Нет, это я торможу. Ты же из отдельного класса делаешь.Тогда вот так:

      class MyThreadedClass
      {
        public MyThreadedClass()
        {
        }
    
        public void StrartWork()
        {
          Thread t = new Thread(delegate()
            {
              for (int i = 0; i < 100; i++)
              {
                Thread.Sleep(10);
                if (Application.OpenForms["Form1"].InvokeRequired)
                {
                  Application.OpenForms["Form1"].Invoke(new MethodInvoker(delegate() { ((ProgressBar)Application.OpenForms["Form1"].Controls["progressBar1"]).Value = i; }));
                }
                else
                {
                  ((ProgressBar)Application.OpenForms["Form1"].Controls["progressBar1"]).Value = i;
                }
              }
            }
    
            );
          t.Start();
        }
      }
    

    • Помечено в качестве ответа geforse 12 августа 2010 г. 11:53
    12 августа 2010 г. 11:00
    Модератор
  • ulcer , спасибо что помогаешь, но снова ошибка "Ссылка на объект не указывает на экземпляр объекта .")
    Ругается на эту строку:
     if
     (Application.OpenForms["Form1"
    ].InvokeRequired)
    12 августа 2010 г. 11:11
  • Как форма называется, на которой прогресс бар находится?
     
    12 августа 2010 г. 11:15
    Модератор
  • Да нет, ошибка не в этом. Form1.cs

    Вот так заработало:

    Form form1 = (Form)Application.OpenForms[0];
    if (form1.InvokeRequired)
    {
     form1.Invoke(new MethodInvoker(delegate() { progressBar.Value++; }));
    }

    • Изменено geforse 12 августа 2010 г. 11:52 додумался )
    12 августа 2010 г. 11:35
  • Ну у меня такая ошибка возникает, если написать

    if (Application.OpenForms["Form2"].InvokeRequired)
    

    Может пытаешься изменять до того как форма создалась?

    Попробуй так:

       public void StrartWork()
        {
          Thread t = new Thread(delegate()
            {
              for (int i = 0; i < 100; i++)
              {
                Thread.Sleep(10);
                //Добавляем отдельную проверку, что уже есть
                // открытые формы
                if (Application.OpenForms.Count > 0)
                {
                  //if (Application.OpenForms["Form1"].InvokeRequired)
                  // Если только одна форма, то можно и по индексу обратится
                  // На всякий случай, вдруг все-таки имя другое
                  if (Application.OpenForms[0].InvokeRequired)
                  {
                    Application.OpenForms[0].Invoke(new MethodInvoker(delegate() { ((ProgressBar)Application.OpenForms[0].Controls["progressBar1"]).Value = i; }));
                  }
                  else
                  {
                    ((ProgressBar)Application.OpenForms[0].Controls["progressBar1"]).Value = i;
                  }
                }
      
              }
            }
    
            );
          t.Start();
        }
    

    12 августа 2010 г. 11:48
    Модератор