Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 5.00
KokosSPb
126 / 84 / 10
Регистрация: 03.02.2011
Сообщений: 470
#1

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

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

Не ругайтесь, я искал, не нашел ответа на такой вопрос.
Я вот использую потоки следующим образом:
C++
1
2
3
4
5
6
7
void поток(){
while(true){
if(нужно выполнять){
выполняем действие потока
}
}
}
Но тут появилась идея, а можно ли один раз создать функцию в потоке, а потом просто вызывать функцию, будет ли она работать при этом в потоке?
Пояснение:
Можно ли использовать поток не бесконечным циклом, а один раз его Start(), а потом обращаться по имени функции, будет ли она выполняться в отдельном потоке?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.10.2012, 09:47
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Можно ли один раз создать функцию в потоке, а потом просто вызывать ее (C++):

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

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

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

Зачем используют конструкцию в длинных ветвлениях else if, если можно просто использовать один if
Добрый День! У меня очень простой вопрос. Зачем используют конструкцию в...

Создать объект внутри класса, который может вызывать функцию этого класса
Ребята помогите уже несколько дней мучаюсь. Хочу сделать программу в консоле...

Как в цикле можно выполнить действие один раз?
Есть цикл, который выполняется n раз. Но 1 действие в этом цикле необходимо...

31
SatanaXIII
Супер-модератор
Эксперт С++
5766 / 2764 / 374
Регистрация: 01.11.2011
Сообщений: 6,717
Завершенные тесты: 1
30.10.2012, 09:54 #2
KokosSPb, если наоборот разместить поток внутри функции.
То есть вызывается функция->создается поток->отрабатывает->уничтожается.
Я бы еще густо снабдил поток всевозможными задержками и передачами ресурсов головному потоку, но это смотря что он будет делать. Если что-то маленькое и не важное, то вполне.
0
KokosSPb
126 / 84 / 10
Регистрация: 03.02.2011
Сообщений: 470
30.10.2012, 10:08  [ТС] #3
так, я не понял ответа на свой вопрос
По поводу
Цитата Сообщение от SatanaXIII Посмотреть сообщение
То есть вызывается функция->создается поток->отрабатывает->уничтожается.
это ясно.
Но получается, что созданный поток без цикла будет единожды исполнен и далее тупо жрать ресурсы? Или он будет создан и дальнейший вызов этой функции будет выполняться в созданном ранее потоке?
0
SatanaXIII
Супер-модератор
Эксперт С++
5766 / 2764 / 374
Регистрация: 01.11.2011
Сообщений: 6,717
Завершенные тесты: 1
30.10.2012, 10:24 #4
- Если поток корректно завершился, то все ресурсы будут очищены.
- Если в самом потоке принудительно его же завершить (ExitThread) то память-то он отдаст, но на счет остального (указателей..) не уверен. Не знаю.
- Если вообще принудительно его завершить из другого потока (TeminateThread), то ничего не освободится до самого завершения процесса, содержащего поток.
- А если принудительно завалить аж процесс с незавершенным потоком, то одному богу известно, что произойдет. )
0
KokosSPb
126 / 84 / 10
Регистрация: 03.02.2011
Сообщений: 470
30.10.2012, 10:33  [ТС] #5
это тоже всё понятно, не понимаю что я неверно пишу в вопросе
Попробую снова:
Есть функция Поток
C++
1
2
3
static void Функция(){
i++;
}
Я создаю поток
C++
1
2
Thread^ Поток = gcnew Thread( gcnew ThreadStart(&Form::Функция));
Поток->Start();
Он выполнился. Ура.
Я потом могу, например, по нажатию кнопки вызвать в обработчике функцию "Функция". Но эта функция выполнится в старом потоке или просто в форме?
0
CheshireCat
Эксперт С++
2907 / 1256 / 114
Регистрация: 27.05.2008
Сообщений: 3,451
30.10.2012, 10:42 #6
Просто "в форме." Точнее - в том потоке, который создал эту форму и обрабатывает события "нажатие кнопки" на форме (разумеется, форма тоже выполняется потоке. В любой программе есть хотя бы один поток - его еще называют "главный поток приложения").
1
SatanaXIII
Супер-модератор
Эксперт С++
5766 / 2764 / 374
Регистрация: 01.11.2011
Сообщений: 6,717
Завершенные тесты: 1
30.10.2012, 10:43 #7
Загадки во тьме.
Зачем Функции выполняться в отдельном потоке, когда ты ее будешь вызывать в обработчике кнопки, который крутится в потоке формы?

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

Что-то я не пойму в чем подвох.
0
solar_wind
760 / 751 / 58
Регистрация: 06.07.2009
Сообщений: 2,988
Завершенные тесты: 1
30.10.2012, 10:49 #8
KokosSPb,
Ты запустил поток, он привязан к классу потока. Если ты тупо вызовешь функцию из класса потока, то она будет выполняться нифига не в потоке, а там где ты ее вызвал.
Что бы функция вызвалась в потоке ты должен воспользоваться механизмом передачи сообщений. Сообщение придет в поток и поток сам вызовет нужную функцию!
1
SatanaXIII
Супер-модератор
Эксперт С++
5766 / 2764 / 374
Регистрация: 01.11.2011
Сообщений: 6,717
Завершенные тесты: 1
30.10.2012, 10:55 #9
Цитата Сообщение от solar_wind Посмотреть сообщение
Сообщение придет в поток и поток сам вызовет нужную функцию!
Зачем, когда можно запихнуть поток в функцию?
0
solar_wind
760 / 751 / 58
Регистрация: 06.07.2009
Сообщений: 2,988
Завершенные тесты: 1
30.10.2012, 11:02 #10
SatanaXIII, Потому что функцию ты запихиваешь не в поток, а в класс. А то что этот класс создает автоматически поток и запускает очередь сообщений, это уже частности.
Хочешь пиши глобальные функции и выполняй их в любом потоке, который хочешь.
Ну конечно есть библиотеки и классы, которые очень чувствительны к тому с каком потоке выполняются их функции, но это уже отдельная тема.
1
SatanaXIII
Супер-модератор
Эксперт С++
5766 / 2764 / 374
Регистрация: 01.11.2011
Сообщений: 6,717
Завершенные тесты: 1
30.10.2012, 11:06 #11
Цитата Сообщение от solar_wind Посмотреть сообщение
Потому что функцию ты запихиваешь не в поток, а в класс
Цитата Сообщение от solar_wind Посмотреть сообщение
Хочешь пиши глобальные функции и выполняй их в любом потоке
А можно по примеру. На пальцах. Для общего развития.
0
solar_wind
760 / 751 / 58
Регистрация: 06.07.2009
Сообщений: 2,988
Завершенные тесты: 1
30.10.2012, 11:10 #12
SatanaXIII, Примеры чего конкретно?
Как создавать классы?
Как создаются потоки?
Механизмов синхронизации потоков?
Если для общего развития, то в сети уже очень много и примеров и описаний этого, изучайте.
0
KokosSPb
126 / 84 / 10
Регистрация: 03.02.2011
Сообщений: 470
30.10.2012, 11:10  [ТС] #13
Цитата Сообщение от solar_wind Посмотреть сообщение
KokosSPb,
Ты запустил поток, он привязан к классу потока. Если ты тупо вызовешь функцию из класса потока, то она будет выполняться нифига не в потоке, а там где ты ее вызвал.
Что бы функция вызвалась в потоке ты должен воспользоваться механизмом передачи сообщений. Сообщение придет в поток и поток сам вызовет нужную функцию!

Спасибо, ты ответил на мой первоначальный вопрос
0
SatanaXIII
Супер-модератор
Эксперт С++
5766 / 2764 / 374
Регистрация: 01.11.2011
Сообщений: 6,717
Завершенные тесты: 1
30.10.2012, 11:14 #14
Цитата Сообщение от solar_wind Посмотреть сообщение
Если для общего развития, то в сети уже очень много и примеров и описаний этого, изучайте.
Хорошо.
0
solar_wind
760 / 751 / 58
Регистрация: 06.07.2009
Сообщений: 2,988
Завершенные тесты: 1
30.10.2012, 11:28 #15
SatanaXIII, Да, и поток в функцию ты запихнуть никак не можешь, просто потому что это совершенно разные понятия. В функции ты можешь запустить поток.
Если поток привязан к динамически созданному объекту класса, то он будет спокойно выполняться и после завершения этой твоей функции. А если объект класса потока статический, то после завершения функции будет вызван деструктор, который уничтожит объект, а тот в свою очередь уничтожит привязанный к нему поток, ведь потоком все равно кто то должен управлять.
0
SatanaXIII
Супер-модератор
Эксперт С++
5766 / 2764 / 374
Регистрация: 01.11.2011
Сообщений: 6,717
Завершенные тесты: 1
30.10.2012, 11:59 #16
solar_wind, да. Логично.
Ведь если у нас поток не завершится до завершения функции, то и функция ничего не вернет. Хотя, к примеру, если нам не требуется ничего возвращать, а только выполнять какие-либо действия (мигать произвольным пикселем на экране пять секунд), то вполне подходит. По запуску функции запускается поток, который отсчитывает пять секунд. И нам по сути без разницы что там будет происходить после завершения функции. А весь код, в том числе и создания потока, лежит как раз внутри одной функции.
0
solar_wind
760 / 751 / 58
Регистрация: 06.07.2009
Сообщений: 2,988
Завершенные тесты: 1
30.10.2012, 12:04 #17
SatanaXIII, Вам нужно внимательно изучать книги по теории и практике ООП. Вы подменяете и неверно интерпретируете понятия.
Это тоже самое, как утверждать, что квартира содержится в двери, ведь вы входите в нее через дверь.....
0
SatanaXIII
Супер-модератор
Эксперт С++
5766 / 2764 / 374
Регистрация: 01.11.2011
Сообщений: 6,717
Завершенные тесты: 1
30.10.2012, 12:07 #18
solar_wind, поэтому я и просил пример.
0
solar_wind
760 / 751 / 58
Регистрация: 06.07.2009
Сообщений: 2,988
Завершенные тесты: 1
30.10.2012, 12:08 #19
SatanaXIII, Вам пример не поможет, вам с теорией разобраться нужно, а потом уже смотреть, как это выглядит на примерах.
0
SatanaXIII
Супер-модератор
Эксперт С++
5766 / 2764 / 374
Регистрация: 01.11.2011
Сообщений: 6,717
Завершенные тесты: 1
30.10.2012, 12:09 #20
Цитата Сообщение от solar_wind Посмотреть сообщение
квартира содержится в двери, ведь вы входите в нее через дверь
Кстати хороший пример. Серьезно.

Добавлено через 22 секунды
Цитата Сообщение от solar_wind Посмотреть сообщение
Вам пример не поможет
Может быть.
0
30.10.2012, 12:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.10.2012, 12:09
Привет! Вот еще темы с решениями:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru