Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Мелкие непонятки с потоками и (?) делегатами, [C#] [2010] 
:(
    Опции темы
Urvin
Дата 27.6.2010, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 1.6.2006

Репутация: нет
Всего: нет



Я в сишарпе только начинаю, хотя с другими языками прекрасно имел дело.
Столкнулся с необходимостью использования потока в одном из моих модулей. Здесь поток является неким дополнительным объектом, в отличие от прочих ЯП, где для действий в отдельном потоке используется наследование. 
Видимо, этот стереотип и не дает мне никак разобраться.

Задача такова: есть  класс примерно такого содержания:
Код

public class MyClass
{
    private int a;
    private int b;

    public MyClass()
    {
        a = 0;
        b = 0;
    }

    //--------------------------------------------------------//

    protected void doCalculateA()
    {
        while (a < 1000)
            a++;
    }

    protected void doCalculateB
    {
        while (b < 10000)
            b++;
    }

    //--------------------------------------------------------//

    protected void doCalculateAandB()
    {
        doCalculateA();
        // Тут вызвать событие, что А подготовлено

        doCalculateB();
        // Тут вызвать событие, что В подготовлено
    }

    //--------------------------------------------------------//

    public void Calculate()
    {
        Thread lThread = new Thread(doCalculateAandB);
        lThread.Start();

        lThread.Join();
        // Вызвать событие об окончании работы потока
    }
}


lThread.Join() лишний, но пока не понимаю как избавиться от него.

Извне я могу вызвать только MyClass.Calculate(), от которой мне хотелось бы выполнения в отдельном потоке,  а также высылку событий об окончании расчета переменной А, переменной Б и завершении потока.
 Т.е. форма вызова должна быть примерно такой:

Код

private void OnACalculated(int aErrorCode)
{
    // прием события о расчете А
}

private void OnВCalculated(int aErrorCode)
{
    // прием события о расчете А
}

private void OnThreadFinished()
{
    // прием события об окончании работы треда
}

...

MyClass lCalculator = new MyClass;
lCalculator.OnACalculated = OnACalculated;
lCalculator.OnBCalculated = OnBCalculated;
lCalculator.OnThreadFinished = OnThreadFinished;
lCalculator.Calculate();


Подскажите, пожалуйста, как мне правильно запустить вычисления в отдельном потоке и правильно описать событийную модель?
PM MAIL   Вверх
Partizan
Дата 28.6.2010, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 8
Всего: 67



Urvin, я думаю стоит посмотреть BackgroundWorker.


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
MrDale
Дата 29.6.2010, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 15.10.2006
Где: Ульяновск

Репутация: нет
Всего: нет



Можно так:
Код

        public Action<Exception> OnCalculatedA;
        public Action<Exception> OnCalculatedB;
        public Action OnThreadFinished;

        protected void doCalculateAandB()
        {
            Exception error = null;
            try
            {
                doCalculateA();
            }
            catch (Exception ex)
            {
                error = ex;
            }
            if (OnCalculatedA != null)
                OnCalculatedA(error);

            error = null;
            try
            {
                doCalculateB();
            }
            catch (Exception ex)
            {
                error = ex;
            }
            if (OnCalculatedB != null)
                OnCalculatedB(error);

            if (OnThreadFinished != null)
                OnThreadFinished();
        }


Только учтите что OnXXX будут вызвать в том-же дополнительном потоке.
PM MAIL WWW ICQ Skype Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1035 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.