Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.11.2014, 12:38   #1
login10
Пользователь
 
Аватар для login10
 
Регистрация: 01.11.2014
Сообщений: 10
Подмигивание Как передать данные в поток..

Здраствуйте Уважаемые коллеги!
Начал только недавно работать с C# и мало что о нем знаю.
Как передать какие то данные в поток?



Вот как видно из рисунка, при вызове метода prepareThreads(), он вызывает метод F_MYIP(), т.е. F_MYIP() будет работать параллельно в три потока. И мне нужно этому методу ещё передать какие то дополнительные данные. Я планирую всем трем потокам передавать разные строки. И как вот это все оформить понятия не имею.
Подскажите как правильно прописать код. Спасибо.
login10 вне форума Ответить с цитированием
Старый 01.11.2014, 12:54   #2
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

либо запускайте в поток параметрическую функцию, либо создайте волатильные переменные в том же классе.
И все дела.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 01.11.2014, 13:42   #3
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Чтобы использовать volatile надо знать что это и почему, а то внезапно столкнется автор с другими проблемами. volatile это не магия, зашишающая от всего на свете, часто нужны другие механизмы типа lock.
http://stackoverflow.com/a/19384758/964478

Цитата:
Начал только недавно работать с C# и мало что о нем знаю.
Как передать какие то данные в поток?
Ну почитайте что-нибудь про них. Гугл, msdn, stackoverflow, книги.

Нельзя просто так взять и написать корректное многопоточное приложение. И объяснить все на форуме тоже сложно, это большая и не простая тема.

И лучше использовать более новые средства (абстракции) для создания и управления потоками, чем древний Thread.
Если на Delphi раньше писали (это ж таки форум дельфистов), то BackgroundWorker похож на TThread в Delphi.
А еще лучше Task (TPL).
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 01.11.2014 в 13:55.
Alex11223 вне форума Ответить с цитированием
Старый 01.11.2014, 14:07   #4
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
И лучше использовать более новые средства (абстракции) для создания и управления потоками, чем древний Thread.
А еще лучше Task (TPL).
Ну а подробнее можно про "новые методы". Раз уж сказали "А" то говорите и "Б". А то вносите только еще больше непонятностей.
И хорошо бы сравнительную табличку трэда и новых методов.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 01.11.2014, 14:14   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Какую еще табличку? Просто Task удобнее в большинстве случаев, чем более "низкоуровневый" Thread (и по эффективности тоже лучше при создании большого числа задач из-за использования ThreadPool и т.п., чем тупо самому создавать по потоку на каждую).

Что подробнее? Максимального размера сообщения форума не хватит для подробного описания TPL + концепций многопоточного программирования.

http://www.codeproject.com/Articles/...l-Library-of-n
http://msdn.microsoft.com/en-us/libr...vs.100%29.aspx

Цитата:
почитайте что-нибудь про них. Гугл, msdn, stackoverflow, книги.
Нельзя просто так взять и написать корректное многопоточное приложение. И объяснить все на форуме тоже сложно, это большая и не простая тема.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 01.11.2014 в 14:37.
Alex11223 вне форума Ответить с цитированием
Старый 01.11.2014, 14:37   #6
login10
Пользователь
 
Аватар для login10
 
Регистрация: 01.11.2014
Сообщений: 10
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Ну почитайте что-нибудь про них. Гугл, msdn, stackoverflow, книги.

Нельзя просто так взять и написать корректное многопоточное приложение. И объяснить все на форуме тоже сложно, это большая и не простая тема.
Так то оно так, но практика то все равно нужна. Сколько не читай а если не закрепишь практически то все знания быстро выветрятся.
Но я уже нашол решение. Просто при каждой интеграции цыкла... при создании каждого потока я увеличиваю значение спецыальной глобальной переменной на плюс 1,
а потом уже смотрю чему она равна и таким образом буду знать какое элемент массива (свою строку), мне подставить в каждый поток.
Мне кажется это гениально, как вы считаете?


Код:


public string prepareThreads(){

for (int i = 0; i < _countThreads; i++){
threads[i] = new Thread(F_MYIP);
threads[i].IsBackground = true;
threads[i].Start();
count_arr=i; //     ------   спецыальная переменная 
}

return "Ok";
}


public void F_MYIP(){

// а здесь мы уже при вызове метода, т.е. при создании потока смотрм чему равна count_arr и можем выбрать из какого нибудь массива нужный элемент
// ...

// ...

}
Ладно, всем спасибо за помошь =)
login10 вне форума Ответить с цитированием
Старый 01.11.2014, 14:55   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Лучше уж так:

Код:
        public string prepareThreads()
        {
            for (int i = 0; i < _countThreads; i++)
            {
                string param = "abc" + i;

                threads[i] = new Thread(F_MYIP);
                threads[i].IsBackground = true;
                threads[i].Start(param);
            }

            return "Ok";
        }


        public void F_MYIP(object arg)
        {
            string text = arg.ToString();
            Console.WriteLine(text);
        }
или так (лямбда или анонимный метод):

Код:
        public string prepareThreads()
        {
            for (int i = 0; i < _countThreads; i++)
            {
                string param = "abc" + i;

                threads[i] = new Thread(() => F_MYIP(param));
                threads[i].IsBackground = true;
                threads[i].Start();
            }

            return "Ok";
        }


        public void F_MYIP(string text)
        {
            Console.WriteLine(text);
        }
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 01.11.2014, 15:00   #8
login10
Пользователь
 
Аватар для login10
 
Регистрация: 01.11.2014
Сообщений: 10
По умолчанию

Alex11223,
Вот! Вот примерно чето такое я и хотел от ваас. Ну спасибо.
login10 вне форума Ответить с цитированием
Старый 01.11.2014, 15:01   #9
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Просто Task удобнее в большинстве случаев, чем более "низкоуровневый" Thread
Это лично ваше мнение?

Пул потоков не панацея. Для каждой задачи нужно свое решение. Конечно если у вас приложение требует каждую секунду создавать десятки потоков то пул будет несомненно полезен, но если вам нужен 1 - 2 потока с серьезной нагрузкой то придется взять молоток и напильник и вернутся к "древним" Thread.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 01.11.2014, 15:08   #10
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Task/TPL — просто более высокоуровневая абстракция. Разница в производительности может и не нужна во многих случаях, но основной смысл не в ней, а в удобстве механизмов для работы с ними, не придется их самому пилить с 0 с Thread. Хотя бы самое простое: обработка исключений, возвращение результата, остановка, синхронизация (CancellationToken, TaskSheduler, ContinueWith, ...), а в C#5 еще и async/await.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как передать данные из WebBrowser'a ? Santa86 C# (си шарп) 0 15.10.2014 17:42
Как передать динамический массив в поток? bilibian Общие вопросы Delphi 8 28.02.2014 15:22
Как передать структуру в поток при _beginthread Ksardas13 Общие вопросы C/C++ 2 10.03.2012 05:00
Как передать параметр в поток? Pack Общие вопросы Delphi 3 22.02.2012 12:09
Как передать данные из БД в ComBox uni Microsoft Office Excel 8 22.07.2011 08:20