Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.92/26: Рейтинг темы: голосов - 26, средняя оценка - 4.92
128 / 86 / 10
Регистрация: 03.02.2011
Сообщений: 477

Можно ли один раз создать функцию в потоке, а потом просто вызывать ее

30.10.2012, 09:47. Показов 5869. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не ругайтесь, я искал, не нашел ответа на такой вопрос.
Я вот использую потоки следующим образом:
C++
1
2
3
4
5
6
7
void поток(){
while(true){
if(нужно выполнять){
выполняем действие потока
}
}
}
Но тут появилась идея, а можно ли один раз создать функцию в потоке, а потом просто вызывать функцию, будет ли она работать при этом в потоке?
Пояснение:
Можно ли использовать поток не бесконечным циклом, а один раз его Start(), а потом обращаться по имени функции, будет ли она выполняться в отдельном потоке?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.10.2012, 09:47
Ответы с готовыми решениями:

Можно ли в ENTER_FRAME запустить функцию один раз?
Например, мне нужно, чтобы при столкновении объектов (круга и квадрата), квадрат начинал крутиться. Я просчитываю кадры до столкновения, а...

Написать функцию раньше мейна, через void. потом в мейне её вызывать
Помогите. Нужно написать функцию раньше мейна, через void. потом в мейне её вызывать #include <iostream.h> #include...

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

31
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
30.10.2012, 09:54
KokosSPb, если наоборот разместить поток внутри функции.
То есть вызывается функция->создается поток->отрабатывает->уничтожается.
Я бы еще густо снабдил поток всевозможными задержками и передачами ресурсов головному потоку, но это смотря что он будет делать. Если что-то маленькое и не важное, то вполне.
0
128 / 86 / 10
Регистрация: 03.02.2011
Сообщений: 477
30.10.2012, 10:08  [ТС]
так, я не понял ответа на свой вопрос
По поводу
Цитата Сообщение от SatanaXIII Посмотреть сообщение
То есть вызывается функция->создается поток->отрабатывает->уничтожается.
это ясно.
Но получается, что созданный поток без цикла будет единожды исполнен и далее тупо жрать ресурсы? Или он будет создан и дальнейший вызов этой функции будет выполняться в созданном ранее потоке?
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
30.10.2012, 10:24
- Если поток корректно завершился, то все ресурсы будут очищены.
- Если в самом потоке принудительно его же завершить (ExitThread) то память-то он отдаст, но на счет остального (указателей..) не уверен. Не знаю.
- Если вообще принудительно его завершить из другого потока (TeminateThread), то ничего не освободится до самого завершения процесса, содержащего поток.
- А если принудительно завалить аж процесс с незавершенным потоком, то одному богу известно, что произойдет. )
0
128 / 86 / 10
Регистрация: 03.02.2011
Сообщений: 477
30.10.2012, 10:33  [ТС]
это тоже всё понятно, не понимаю что я неверно пишу в вопросе
Попробую снова:
Есть функция Поток
C++
1
2
3
static void Функция(){
i++;
}
Я создаю поток
C++
1
2
Thread^ Поток = gcnew Thread( gcnew ThreadStart(&Form::Функция));
Поток->Start();
Он выполнился. Ура.
Я потом могу, например, по нажатию кнопки вызвать в обработчике функцию "Функция". Но эта функция выполнится в старом потоке или просто в форме?
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
30.10.2012, 10:42
Просто "в форме." Точнее - в том потоке, который создал эту форму и обрабатывает события "нажатие кнопки" на форме (разумеется, форма тоже выполняется потоке. В любой программе есть хотя бы один поток - его еще называют "главный поток приложения").
1
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
30.10.2012, 10:43
Загадки во тьме.
Зачем Функции выполняться в отдельном потоке, когда ты ее будешь вызывать в обработчике кнопки, который крутится в потоке формы?

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

Что-то я не пойму в чем подвох.
0
 Аватар для solar_wind
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
30.10.2012, 10:49
KokosSPb,
Ты запустил поток, он привязан к классу потока. Если ты тупо вызовешь функцию из класса потока, то она будет выполняться нифига не в потоке, а там где ты ее вызвал.
Что бы функция вызвалась в потоке ты должен воспользоваться механизмом передачи сообщений. Сообщение придет в поток и поток сам вызовет нужную функцию!
1
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
30.10.2012, 10:55
Цитата Сообщение от solar_wind Посмотреть сообщение
Сообщение придет в поток и поток сам вызовет нужную функцию!
Зачем, когда можно запихнуть поток в функцию?
0
 Аватар для solar_wind
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
30.10.2012, 11:02
SatanaXIII, Потому что функцию ты запихиваешь не в поток, а в класс. А то что этот класс создает автоматически поток и запускает очередь сообщений, это уже частности.
Хочешь пиши глобальные функции и выполняй их в любом потоке, который хочешь.
Ну конечно есть библиотеки и классы, которые очень чувствительны к тому с каком потоке выполняются их функции, но это уже отдельная тема.
1
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
30.10.2012, 11:06
Цитата Сообщение от solar_wind Посмотреть сообщение
Потому что функцию ты запихиваешь не в поток, а в класс
Цитата Сообщение от solar_wind Посмотреть сообщение
Хочешь пиши глобальные функции и выполняй их в любом потоке
А можно по примеру. На пальцах. Для общего развития.
0
 Аватар для solar_wind
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
30.10.2012, 11:10
SatanaXIII, Примеры чего конкретно?
Как создавать классы?
Как создаются потоки?
Механизмов синхронизации потоков?
Если для общего развития, то в сети уже очень много и примеров и описаний этого, изучайте.
0
128 / 86 / 10
Регистрация: 03.02.2011
Сообщений: 477
30.10.2012, 11:10  [ТС]
Цитата Сообщение от solar_wind Посмотреть сообщение
KokosSPb,
Ты запустил поток, он привязан к классу потока. Если ты тупо вызовешь функцию из класса потока, то она будет выполняться нифига не в потоке, а там где ты ее вызвал.
Что бы функция вызвалась в потоке ты должен воспользоваться механизмом передачи сообщений. Сообщение придет в поток и поток сам вызовет нужную функцию!

Спасибо, ты ответил на мой первоначальный вопрос
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
30.10.2012, 11:14
Цитата Сообщение от solar_wind Посмотреть сообщение
Если для общего развития, то в сети уже очень много и примеров и описаний этого, изучайте.
Хорошо.
0
 Аватар для solar_wind
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
30.10.2012, 11:28
SatanaXIII, Да, и поток в функцию ты запихнуть никак не можешь, просто потому что это совершенно разные понятия. В функции ты можешь запустить поток.
Если поток привязан к динамически созданному объекту класса, то он будет спокойно выполняться и после завершения этой твоей функции. А если объект класса потока статический, то после завершения функции будет вызван деструктор, который уничтожит объект, а тот в свою очередь уничтожит привязанный к нему поток, ведь потоком все равно кто то должен управлять.
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
30.10.2012, 11:59
solar_wind, да. Логично.
Ведь если у нас поток не завершится до завершения функции, то и функция ничего не вернет. Хотя, к примеру, если нам не требуется ничего возвращать, а только выполнять какие-либо действия (мигать произвольным пикселем на экране пять секунд), то вполне подходит. По запуску функции запускается поток, который отсчитывает пять секунд. И нам по сути без разницы что там будет происходить после завершения функции. А весь код, в том числе и создания потока, лежит как раз внутри одной функции.
0
 Аватар для solar_wind
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
30.10.2012, 12:04
SatanaXIII, Вам нужно внимательно изучать книги по теории и практике ООП. Вы подменяете и неверно интерпретируете понятия.
Это тоже самое, как утверждать, что квартира содержится в двери, ведь вы входите в нее через дверь.....
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
30.10.2012, 12:07
solar_wind, поэтому я и просил пример.
0
 Аватар для solar_wind
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
30.10.2012, 12:08
SatanaXIII, Вам пример не поможет, вам с теорией разобраться нужно, а потом уже смотреть, как это выглядит на примерах.
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
30.10.2012, 12:09
Цитата Сообщение от solar_wind Посмотреть сообщение
квартира содержится в двери, ведь вы входите в нее через дверь
Кстати хороший пример. Серьезно.

Добавлено через 22 секунды
Цитата Сообщение от solar_wind Посмотреть сообщение
Вам пример не поможет
Может быть.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.10.2012, 12:09
Помогаю со студенческими работами здесь

Как реализовать функцию-член, которую можно вызвать только один единственный раз?
Доброго времени суток. Моя проблема в том, что при создании экземпляра дочернего класса, выполняется функция DoSmth() хотя, уже есть...

Как каждый раз вызывать функцию с разной задержкой?
К примеру у меня есть функция: var Sector = document.getElementById("Sector"); var Window =...

Создать функцию, определяющую номера элементов, которые встречаются в массиве только один раз
Создать функцию, определяющую номера элементов, которые встречаются в массиве только один раз.С++

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

Как можно вызывать один класс в разных activity?
Всем привет! Пишу плеер типа ютюба и нужно, чтобы один класс вызывался в нескольких активти. я думаю нет смысла писать код плеера в каждой...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru