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

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

30.10.2012, 09:47. Просмотров 2909. Ответов 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
Ответы с готовыми решениями:

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

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

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

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

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

31
SatanaXIII
Супер-модератор
Эксперт С++
5773 / 2772 / 376
Регистрация: 01.11.2011
Сообщений: 6,744
Завершенные тесты: 1
30.10.2012, 09:54 2
KokosSPb, если наоборот разместить поток внутри функции.
То есть вызывается функция->создается поток->отрабатывает->уничтожается.
Я бы еще густо снабдил поток всевозможными задержками и передачами ресурсов головному потоку, но это смотря что он будет делать. Если что-то маленькое и не важное, то вполне.
0
KokosSPb
127 / 85 / 10
Регистрация: 03.02.2011
Сообщений: 470
30.10.2012, 10:08  [ТС] 3
так, я не понял ответа на свой вопрос
По поводу
Цитата Сообщение от SatanaXIII Посмотреть сообщение
То есть вызывается функция->создается поток->отрабатывает->уничтожается.
это ясно.
Но получается, что созданный поток без цикла будет единожды исполнен и далее тупо жрать ресурсы? Или он будет создан и дальнейший вызов этой функции будет выполняться в созданном ранее потоке?
0
SatanaXIII
Супер-модератор
Эксперт С++
5773 / 2772 / 376
Регистрация: 01.11.2011
Сообщений: 6,744
Завершенные тесты: 1
30.10.2012, 10:24 4
- Если поток корректно завершился, то все ресурсы будут очищены.
- Если в самом потоке принудительно его же завершить (ExitThread) то память-то он отдаст, но на счет остального (указателей..) не уверен. Не знаю.
- Если вообще принудительно его завершить из другого потока (TeminateThread), то ничего не освободится до самого завершения процесса, содержащего поток.
- А если принудительно завалить аж процесс с незавершенным потоком, то одному богу известно, что произойдет. )
0
KokosSPb
127 / 85 / 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
Эксперт С++
2912 / 1261 / 114
Регистрация: 27.05.2008
Сообщений: 3,464
30.10.2012, 10:42 6
Просто "в форме." Точнее - в том потоке, который создал эту форму и обрабатывает события "нажатие кнопки" на форме (разумеется, форма тоже выполняется потоке. В любой программе есть хотя бы один поток - его еще называют "главный поток приложения").
1
SatanaXIII
Супер-модератор
Эксперт С++
5773 / 2772 / 376
Регистрация: 01.11.2011
Сообщений: 6,744
Завершенные тесты: 1
30.10.2012, 10:43 7
Загадки во тьме.
Зачем Функции выполняться в отдельном потоке, когда ты ее будешь вызывать в обработчике кнопки, который крутится в потоке формы?

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

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

Спасибо, ты ответил на мой первоначальный вопрос
0
SatanaXIII
Супер-модератор
Эксперт С++
5773 / 2772 / 376
Регистрация: 01.11.2011
Сообщений: 6,744
Завершенные тесты: 1
30.10.2012, 11:14 14
Цитата Сообщение от solar_wind Посмотреть сообщение
Если для общего развития, то в сети уже очень много и примеров и описаний этого, изучайте.
Хорошо.
0
solar_wind
761 / 752 / 58
Регистрация: 06.07.2009
Сообщений: 2,992
Завершенные тесты: 1
30.10.2012, 11:28 15
SatanaXIII, Да, и поток в функцию ты запихнуть никак не можешь, просто потому что это совершенно разные понятия. В функции ты можешь запустить поток.
Если поток привязан к динамически созданному объекту класса, то он будет спокойно выполняться и после завершения этой твоей функции. А если объект класса потока статический, то после завершения функции будет вызван деструктор, который уничтожит объект, а тот в свою очередь уничтожит привязанный к нему поток, ведь потоком все равно кто то должен управлять.
0
SatanaXIII
Супер-модератор
Эксперт С++
5773 / 2772 / 376
Регистрация: 01.11.2011
Сообщений: 6,744
Завершенные тесты: 1
30.10.2012, 11:59 16
solar_wind, да. Логично.
Ведь если у нас поток не завершится до завершения функции, то и функция ничего не вернет. Хотя, к примеру, если нам не требуется ничего возвращать, а только выполнять какие-либо действия (мигать произвольным пикселем на экране пять секунд), то вполне подходит. По запуску функции запускается поток, который отсчитывает пять секунд. И нам по сути без разницы что там будет происходить после завершения функции. А весь код, в том числе и создания потока, лежит как раз внутри одной функции.
0
solar_wind
761 / 752 / 58
Регистрация: 06.07.2009
Сообщений: 2,992
Завершенные тесты: 1
30.10.2012, 12:04 17
SatanaXIII, Вам нужно внимательно изучать книги по теории и практике ООП. Вы подменяете и неверно интерпретируете понятия.
Это тоже самое, как утверждать, что квартира содержится в двери, ведь вы входите в нее через дверь.....
0
SatanaXIII
Супер-модератор
Эксперт С++
5773 / 2772 / 376
Регистрация: 01.11.2011
Сообщений: 6,744
Завершенные тесты: 1
30.10.2012, 12:07 18
solar_wind, поэтому я и просил пример.
0
solar_wind
761 / 752 / 58
Регистрация: 06.07.2009
Сообщений: 2,992
Завершенные тесты: 1
30.10.2012, 12:08 19
SatanaXIII, Вам пример не поможет, вам с теорией разобраться нужно, а потом уже смотреть, как это выглядит на примерах.
0
SatanaXIII
Супер-модератор
Эксперт С++
5773 / 2772 / 376
Регистрация: 01.11.2011
Сообщений: 6,744
Завершенные тесты: 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

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

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

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


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

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

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