Многопоточность В C#

Тема в разделе ".NET", создана пользователем Villiya, 26 дек 2011.

  1. Villiya

    Villiya Гость

    доброго всем времени суток.
    помогите разобраться: у меня проект C# FormApplication в нем есть 2 формы Form1 и Form2, на Form2 есть кнопка "расчет" при нажатии на которую происходит вызов функции Go(), на Form1 находится кнопка "визуализация", которая вызывает Visualisation() - визуализацию того процесса, который расчитывается в Go(), но получается так,что у меня с начала считается до конца Go() и при вызове Visualisation() у меня визуализируется только последняя картинка из Go(), а мне нужно чтобы Go() считался как бы в фоне, и при этом можно было вызывать в любой момент расчета Visualisation(). насколько понимаю для этого нужно использовать 2 потока, при этом Go() будет находится в основном потоке, а Visualisation() в параллельном. т.е. все это будет выглядеть как-то так?

    Код (Text):
    class Class1
    {
    public void Go()
    {
    //какое-то вычисление
    }
    }
    class Class2
    {

    public void Visualisation()
    {
    //что-то там
    }
    }

    class Program
    {
    static void Main()
    {
    ThreadClass tc = new ThreadClass();
    Thread firstthread = new Thread(new ThreadStart(tc.Go));
    Thread secondthread = new Thread(new ThreadStart(tc.Visualisation));
    firstthread.Start();
    secondthread.Start();
    }
    }
    а как же тогда что это должно срабатывать по нажатию кнопок?
     
  2. LuMee

    LuMee Well-Known Member

    Регистрация:
    2 май 2006
    Сообщения:
    477
    Симпатии:
    0
    Я бы сделал так:
    1. Код метода Go запускается в отдельном потоке
    2. В ходе выполнения метода Go время от времени выстреливается некоторе событие, уведомляющее о выполнении очередного этапа расчета
    3. Обработчик вышеуказанного события должен соответствующим образом обновлять визуализацию процесса (сдвигать там прогресс-бар, перерисовывать картинку и т.п.). Не забываем, что обработчик дергается не из основного потока, так что надо учитывать InvokeRequired.

    Если не стоит задача реализовать все строго своими руками, имеет смысл поглядеть на класс BackgroundWorker; он все вышеперечисленное предоставляет "из коробки", остается только нарисовать обработчики нужных событий.
     
Загрузка...
Похожие Темы - Многопоточность
  1. 123456789igor
    Ответов:
    0
    Просмотров:
    915
  2. Vadik(R)
    Ответов:
    1
    Просмотров:
    1.406
  3. sanch
    Ответов:
    2
    Просмотров:
    3.065

Поделиться этой страницей