Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
 Аватар для useruser
166 / 90 / 38
Регистрация: 29.06.2015
Сообщений: 1,100

Подскажите по использованию потоков

24.12.2015, 07:58. Показов 857. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В ходе изучения возникло несколько вопросов. Пожалуйста, подскажите или поправьте если я не прав.
1) Нужно ли уничтожать объект после его создания? Например я создал поток (или другой объект)
C#
1
2
3
Thread Thread_1 = new Thread(my_function); 
Thread_1.Priority = ThreadPriority.Normal;
Thread_1.Start();
Мне надо его уничтожать или сборщик мусора c# сам всё сделает?
А как в случае с массивами? Нужно ли обнулять массив, после окончания работы с ним или в случае его заполнения новыми данными?

2) Как передать функцию с аргументом в поток?
C#
1
2
//Не принимает
Thread Thread_1 = new Thread(my_function(1));

3) Возращаясь к предыдущему вопросу-коду. Я правильно понимаю, что моя функция (все её директивы-код) будут выполнены в потоке, после чего поток завершится? А как мне вызывать несколько функций в потоке, без объединения этих функций в одну? Это впринципе возможно?
Я хочу сделать одно действие в потоке, потом другое. Но объединять-вызывать функции в новой функции не хочу.

Пример кода с объединением. Объединив 2 функции в одну, мы выполняем их последовательно.
C#
1
2
3
4
5
6
7
8
9
public void my_function()
{
do_somethink_1();
do_somethink_2();
}
..............
Thread Thread_1 = new Thread(my_function); 
Thread_1.Priority = ThreadPriority.Normal;
Thread_1.Start();

Пример кода без объединения. Как тут выполнять функции последовательно (в потоке)?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
Thread Thread_1 = new Thread(do_somethink_1); 
Thread_1.Priority = ThreadPriority.Normal;
Thread_1.Start();
 
//Но это второй поток, задачи выполняются паралельно.
Thread Thread_2 = new Thread(do_somethink_2); 
Thread_2.Priority = ThreadPriority.Normal;
Thread_2.Start();
 
//Может, как то так?
Thread Thread_3 = new Thread(do_somethink_1,do_somethink_2); 
Thread_3.Priority = ThreadPriority.Normal;
Thread_3.Start();
Или всё же правильнее и удобнее группировать весь код в отдельные функции. А потом вызывать эти функции в "главной функции", запуская эту функцию в потоке?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.12.2015, 07:58
Ответы с готовыми решениями:

Подскажите правильное решение по использованию потоков
есть форма в ней запускается параллельный поток Worker в worker нужно в замкнутом цикле постоянно выполнять работу public void...

Подскажите По Использованию &насервере И &насерверебезконтекст
Здравствуйте ув. знатоки. Суть вопроса такая. Допустим есть форма на которой есть реквизиты формы "Организация",...

Подскажите статьи, посвящённые использованию ООП
Может кто-нибудь подсказать статьи, посвящённые использованию ООП на VB6? Всё, что я находил, было про Visual Basic.NET, а для VB6 нет...

5
44 / 33 / 14
Регистрация: 27.04.2012
Сообщений: 153
24.12.2015, 08:08
2.
C#
1
Thread Thread_1 = new Thread(delegate {my_function(1)});
1
 Аватар для useruser
166 / 90 / 38
Регистрация: 29.06.2015
Сообщений: 1,100
24.12.2015, 09:54  [ТС]
Цитата Сообщение от Svorky Посмотреть сообщение
Thread Thread_1 = new Thread(delegate {my_function(1)});
Ясно. А если уже внутри функции, которая уже передана в поток?

Запустили главный поток при загрузке формы. В него передали функцию.
C#
1
2
3
4
5
6
private void RadForm1_Load(object sender, EventArgs e)
{
               Thread Main_thread = new Thread(main_function);
                Main_thread.Priority = ThreadPriority.Normal;
                Main_thread.Start();
}
Код главной функции
C#
1
2
3
4
5
6
7
8
public void main_function()
{
//Функция показа формы из потока. Код с ошибками - VS подчеркивает красным и не компилирует.
this.Invoke(new Action(delegate {show_message_form("Идет загрузка. Пожалуйста, подождите.", 1)});
              
//Функция скрытия формы из потока. Код без ошибок.
this.Invoke(new Action(hide_message_form));              
}
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
25.12.2015, 14:39
//Функция показа формы из потока. Код с ошибками - VS подчеркивает красным и не компилирует.
Ну так вы на скобки посмотрите... и точки с запятой нехватает.
C#
1
this.Invoke(new Action(delegate { show_message_form("Идет загрузка. Пожалуйста, подождите.", 1); }));
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
25.12.2015, 14:48
useruser, при создании потоков или пользуйтесь тасками, тогда при закрытии основной формы они сами умрут (если не завершились), или ставьте потоку свойство IsBackground=true
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
25.12.2015, 15:12
Цитата Сообщение от useruser Посмотреть сообщение
1) Нужно ли уничтожать объект после его создания?
Не нужно. Сборщик сам соберет неиспользуемые объекты. Исключение - объекты реализующие интерфейс IDisposable. Для них явно нужно вызывать метод Dispose(или использовать оператор using) после того, как вы перестали им пользоваться. (но Thread не реализует IDisposable, поэтому для него вызывать dispose не нужно).

Цитата Сообщение от useruser Посмотреть сообщение
3) Возращаясь к предыдущему вопросу-коду. Я правильно понимаю, что моя функция (все её директивы-код) будут выполнены в потоке, после чего поток завершится? А как мне вызывать несколько функций в потоке, без объединения этих функций в одну? Это впринципе возможно?
Я хочу сделать одно действие в потоке, потом другое. Но объединять-вызывать функции в новой функции не хочу.
Если ваш метод (который вы передали потоку в конструктор) завершился, то повторно вызывать Start для потока - не получится.
Выход - либо не завершать этот метод (а в нем например сделать цикл который будет ожидать делегат и выполнять его когда он появится), либо - использовать ThreadPool, который как раз предназначен для выполнения методов в многопоточном режиме без создания каждый раз нового потока.
Ну или другие варианты (LINQ parallel, Task), которые уже сами там разберутся как им потоки создавать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.12.2015, 15:12
Помогаю со студенческими работами здесь

Подскажите рабочий пример по использованию TThread
Если Вам не трудно, дайте ссылку или скиньте тут рабочий пример любого воздействия на форму из дочернего потока. На сколько понимаю...

Подскажите литературу по использованию OpenGL и созданию GUI
Подскажите, пожалуйста, литературу, подходящую для написания программы, где в форме при нажатии на кнопку при задании размеров выводятся...

Подскажите с взаимодействием потоков
Создать два потока-писателя и один поток-читатель. Реализовать взаимодействие с помощью каналов. Для вывода запросов и результатов...

Подскажите литературу для изучения потоков на Delphi
что посоветуете прочитать по потокам на дэлфи ? нашел кесколько статей,но там мнения авторов немножко разнится

Область видимости общей переменной для потоков + закрытие потоков
Есть два вопроса про потоки. Первый. Как можно сделать общую переменную для основного потока и моих ? struct ThreadInfo1 { int...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru