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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> работа с потоками, с чего начать, параллельные вычисления 
:(
    Опции темы
maxfox
  Дата 20.2.2010, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



 Доброе время суток всем!
Уж не ругайте, я понимаю что аналогичных тем в форуме много. Я перелистал кучу страниц - но так и не смог решить свою проблему.

Я только начал изучать потоки, но не получатся повторить даже примитивные сточки кода из раздела справки.
Моя тривиальная задача:
-есть массив из чисел. Пытаюсь каждое число помножить на 2 в своём потоке.

1. создал проект Windows Forms
2. определил массив
3. определил переменную для индекса массива indx
4. создал процедуру в которой происходит перемножение числа в ячейке с индексом indx
4. добавил кнопку и листБокс

-по клику на кнопке я заполняю массив и произвожу вычисления (это желаемое).

вот код боработчика кнопки
Код

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
                 //
                 this->listBox1->Items->Clear();
                 this->myarray->Resize(myarray, 20);
                 this->indx=0;
                 for(int r=0; r<myarray->Length; r++)
                 {
                     myarray[r] = (r+1)*10;
                 }

                 for(int p=0; p<myarray->Length; p++)
                 {
                    
                     System::Threading::Thread^ myThread = gcnew Thread(
                         gcnew System::Threading::ThreadStart( &multTreads::MTform::treadOp  ) );
                     myThread->Start();
                     indx++;
                 }
             }


вот код выполняемой процедуры:
Код

void multTreads::MTform::treadOp()
{
    myarray[indx]*=2.0;
    listBox1->Items->Add(L"calc index: "+indx+L"  .  result: "+myarray[indx] );
}


-при компиляции вылетает ошибка на строчке создания потока
Ошибка    1    error C3350: System::Threading::ThreadStart: конструктор делегата ожидает 2 аргументов    e:\projects\zz_programs vs\tests\multtreads\multtreads\Form1.h    120
-однако эта строчка по сути, повторена из справки. Только там пример на консольном приложении.

Объясните, пожалуйста, в чём проблема?
PM MAIL   Вверх
CYBERDREAM
Дата 20.2.2010, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

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





--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
maxfox
Дата 20.2.2010, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



спасибо. Одну из этих ссылок я уже прошерстил.

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

Во-первых, что  понял - это то, что нельзя вызывать в поток функцию члена этого-же класса.
Нужно создать ссылочный клас функции которого работают по ссылкам с тем самым массивом, который я создал в
классе Формы

Во-вторых, в С++ создание потока отличается от С#.
Методы ParameterizedThreadStart. или ThreadStart  - действительно требуют два аргумента.
Тогда:
1. создаю класс:
Код

ref class myClass
{
public:

    myClass(cli::array<double>^ refArray)
    {
        cArray = refArray;
    }
    //
    cli::array< double >^ cArray;
    int ind;
    //

    void DoProc2(Object^ data)
    {
        int index = System::Convert::ToInt32(data);
        cArray[index]*=2.0;
    }

};


и в обработчик события кнопки:
Код

    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
                 //
                 this->listBox1->Items->Clear();
                 this->myarray->Resize(myarray, 6);
                 this->indx=0;
                 for(int r=0; r<myarray->Length; r++)
                 {
                     myarray[r] = (r+1)*11;
                     this->listBox1->Items->Add(L"init: "+
                     myarray[r] );
                 }
                 //
                                 myClass^ nClass = gcnew myClass(myarray);

                 for(int p=0; p<nClass->cArray->Length; p++)
                 {

                     System::Threading::Thread^ myThread = gcnew Thread( gcnew System::Threading::ParameterizedThreadStart( nClass,&myClass::DoProc2) );

                     myThread->Start(p);
                 }
                 //
                 for(int r=0; r<nClass->cArray->Length; r++)
                 {
                     this->listBox1->Items->Add(L"result: "+
                     myarray[r] );
                 }
             }


..хм.
Все вроде работает, но пока не пойму, как определить, что действительно выполняются несколько потоков....

п.с. Хотелось бы чтобы знающие люди по этому коду подсказали бы - в правильном ли направлении гуляют мои мысли, поскольку меня самого терзают какие то сомнения - ведь в основной массе туторов на эту тему, все как то по другому делается....
PM MAIL   Вверх
sergioK
Дата 23.2.2010, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 207
Регистрация: 15.2.2008

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



Цитата(maxfox @ 20.2.2010,  18:52)
Все вроде работает, но пока не пойму, как определить, что действительно выполняются несколько потоков....


поставить запись в файл имена потоков 

RTFM  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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