Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 5.00
KokosSPb
32 / 82 / 3
Регистрация: 03.02.2011
Сообщений: 463
#1

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

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

Не ругайтесь, я искал, не нашел ответа на такой вопрос.
Я вот использую потоки следующим образом:
C++
1
2
3
4
5
6
7
void поток(){
while(true){
if(нужно выполнять){
выполняем действие потока
}
}
}
Но тут появилась идея, а можно ли один раз создать функцию в потоке, а потом просто вызывать функцию, будет ли она работать при этом в потоке?
Пояснение:
Можно ли использовать поток не бесконечным циклом, а один раз его Start(), а потом обращаться по имени функции, будет ли она выполняться в отдельном потоке?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.10.2012, 09:47     Можно ли один раз создать функцию в потоке, а потом просто вызывать ее
Посмотрите здесь:
C++ Написать функцию раньше мейна, через void. потом в мейне её вызывать
C++ Как реализовать функцию-член, которую можно вызвать только один единственный раз?
Зачем используют конструкцию в длинных ветвлениях else if, если можно просто использовать один if C++
C++ Создать объект внутри класса, который может вызывать функцию этого класса
Как в цикле можно выполнить действие один раз? C++
C++ Определить, можно ли заполнить бочку используя ведра только один раз
C++ Не могу создать поток( Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SatanaXIII
Супер-модератор
Эксперт С++
5593 / 2627 / 240
Регистрация: 01.11.2011
Сообщений: 6,461
Завершенные тесты: 1
30.10.2012, 09:54     Можно ли один раз создать функцию в потоке, а потом просто вызывать ее #2
KokosSPb, если наоборот разместить поток внутри функции.
То есть вызывается функция->создается поток->отрабатывает->уничтожается.
Я бы еще густо снабдил поток всевозможными задержками и передачами ресурсов головному потоку, но это смотря что он будет делать. Если что-то маленькое и не важное, то вполне.
KokosSPb
32 / 82 / 3
Регистрация: 03.02.2011
Сообщений: 463
30.10.2012, 10:08  [ТС]     Можно ли один раз создать функцию в потоке, а потом просто вызывать ее #3
так, я не понял ответа на свой вопрос
По поводу
Цитата Сообщение от SatanaXIII Посмотреть сообщение
То есть вызывается функция->создается поток->отрабатывает->уничтожается.
это ясно.
Но получается, что созданный поток без цикла будет единожды исполнен и далее тупо жрать ресурсы? Или он будет создан и дальнейший вызов этой функции будет выполняться в созданном ранее потоке?
SatanaXIII
Супер-модератор
Эксперт С++
5593 / 2627 / 240
Регистрация: 01.11.2011
Сообщений: 6,461
Завершенные тесты: 1
30.10.2012, 10:24     Можно ли один раз создать функцию в потоке, а потом просто вызывать ее #4
- Если поток корректно завершился, то все ресурсы будут очищены.
- Если в самом потоке принудительно его же завершить (ExitThread) то память-то он отдаст, но на счет остального (указателей..) не уверен. Не знаю.
- Если вообще принудительно его завершить из другого потока (TeminateThread), то ничего не освободится до самого завершения процесса, содержащего поток.
- А если принудительно завалить аж процесс с незавершенным потоком, то одному богу известно, что произойдет. )
KokosSPb
32 / 82 / 3
Регистрация: 03.02.2011
Сообщений: 463
30.10.2012, 10:33  [ТС]     Можно ли один раз создать функцию в потоке, а потом просто вызывать ее #5
это тоже всё понятно, не понимаю что я неверно пишу в вопросе
Попробую снова:
Есть функция Поток
C++
1
2
3
static void Функция(){
i++;
}
Я создаю поток
C++
1
2
Thread^ Поток = gcnew Thread( gcnew ThreadStart(&Form::Функция));
Поток->Start();
Он выполнился. Ура.
Я потом могу, например, по нажатию кнопки вызвать в обработчике функцию "Функция". Но эта функция выполнится в старом потоке или просто в форме?
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,353
30.10.2012, 10:42     Можно ли один раз создать функцию в потоке, а потом просто вызывать ее #6
Просто "в форме." Точнее - в том потоке, который создал эту форму и обрабатывает события "нажатие кнопки" на форме (разумеется, форма тоже выполняется потоке. В любой программе есть хотя бы один поток - его еще называют "главный поток приложения").
SatanaXIII
Супер-модератор
Эксперт С++
5593 / 2627 / 240
Регистрация: 01.11.2011
Сообщений: 6,461
Завершенные тесты: 1
30.10.2012, 10:43     Можно ли один раз создать функцию в потоке, а потом просто вызывать ее #7
Загадки во тьме.
Зачем Функции выполняться в отдельном потоке, когда ты ее будешь вызывать в обработчике кнопки, который крутится в потоке формы?

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

Что-то я не пойму в чем подвох.
solar_wind
756 / 747 / 42
Регистрация: 06.07.2009
Сообщений: 2,969
Завершенные тесты: 1
30.10.2012, 10:49     Можно ли один раз создать функцию в потоке, а потом просто вызывать ее #8
KokosSPb,
Ты запустил поток, он привязан к классу потока. Если ты тупо вызовешь функцию из класса потока, то она будет выполняться нифига не в потоке, а там где ты ее вызвал.
Что бы функция вызвалась в потоке ты должен воспользоваться механизмом передачи сообщений. Сообщение придет в поток и поток сам вызовет нужную функцию!
SatanaXIII
Супер-модератор
Эксперт С++
5593 / 2627 / 240
Регистрация: 01.11.2011
Сообщений: 6,461
Завершенные тесты: 1
30.10.2012, 10:55     Можно ли один раз создать функцию в потоке, а потом просто вызывать ее #9
Цитата Сообщение от solar_wind Посмотреть сообщение
Сообщение придет в поток и поток сам вызовет нужную функцию!
Зачем, когда можно запихнуть поток в функцию?
solar_wind
756 / 747 / 42
Регистрация: 06.07.2009
Сообщений: 2,969
Завершенные тесты: 1
30.10.2012, 11:02     Можно ли один раз создать функцию в потоке, а потом просто вызывать ее #10
SatanaXIII, Потому что функцию ты запихиваешь не в поток, а в класс. А то что этот класс создает автоматически поток и запускает очередь сообщений, это уже частности.
Хочешь пиши глобальные функции и выполняй их в любом потоке, который хочешь.
Ну конечно есть библиотеки и классы, которые очень чувствительны к тому с каком потоке выполняются их функции, но это уже отдельная тема.
SatanaXIII
Супер-модератор
Эксперт С++
5593 / 2627 / 240
Регистрация: 01.11.2011
Сообщений: 6,461
Завершенные тесты: 1
30.10.2012, 11:06     Можно ли один раз создать функцию в потоке, а потом просто вызывать ее #11
Цитата Сообщение от solar_wind Посмотреть сообщение
Потому что функцию ты запихиваешь не в поток, а в класс
Цитата Сообщение от solar_wind Посмотреть сообщение
Хочешь пиши глобальные функции и выполняй их в любом потоке
А можно по примеру. На пальцах. Для общего развития.
solar_wind
756 / 747 / 42
Регистрация: 06.07.2009
Сообщений: 2,969
Завершенные тесты: 1
30.10.2012, 11:10     Можно ли один раз создать функцию в потоке, а потом просто вызывать ее #12
SatanaXIII, Примеры чего конкретно?
Как создавать классы?
Как создаются потоки?
Механизмов синхронизации потоков?
Если для общего развития, то в сети уже очень много и примеров и описаний этого, изучайте.
KokosSPb
32 / 82 / 3
Регистрация: 03.02.2011
Сообщений: 463
30.10.2012, 11:10  [ТС]     Можно ли один раз создать функцию в потоке, а потом просто вызывать ее #13
Цитата Сообщение от solar_wind Посмотреть сообщение
KokosSPb,
Ты запустил поток, он привязан к классу потока. Если ты тупо вызовешь функцию из класса потока, то она будет выполняться нифига не в потоке, а там где ты ее вызвал.
Что бы функция вызвалась в потоке ты должен воспользоваться механизмом передачи сообщений. Сообщение придет в поток и поток сам вызовет нужную функцию!

Спасибо, ты ответил на мой первоначальный вопрос
SatanaXIII
Супер-модератор
Эксперт С++
5593 / 2627 / 240
Регистрация: 01.11.2011
Сообщений: 6,461
Завершенные тесты: 1
30.10.2012, 11:14     Можно ли один раз создать функцию в потоке, а потом просто вызывать ее #14
Цитата Сообщение от solar_wind Посмотреть сообщение
Если для общего развития, то в сети уже очень много и примеров и описаний этого, изучайте.
Хорошо.
solar_wind
756 / 747 / 42
Регистрация: 06.07.2009
Сообщений: 2,969
Завершенные тесты: 1
30.10.2012, 11:28     Можно ли один раз создать функцию в потоке, а потом просто вызывать ее #15
SatanaXIII, Да, и поток в функцию ты запихнуть никак не можешь, просто потому что это совершенно разные понятия. В функции ты можешь запустить поток.
Если поток привязан к динамически созданному объекту класса, то он будет спокойно выполняться и после завершения этой твоей функции. А если объект класса потока статический, то после завершения функции будет вызван деструктор, который уничтожит объект, а тот в свою очередь уничтожит привязанный к нему поток, ведь потоком все равно кто то должен управлять.
SatanaXIII
Супер-модератор
Эксперт С++
5593 / 2627 / 240
Регистрация: 01.11.2011
Сообщений: 6,461
Завершенные тесты: 1
30.10.2012, 11:59     Можно ли один раз создать функцию в потоке, а потом просто вызывать ее #16
solar_wind, да. Логично.
Ведь если у нас поток не завершится до завершения функции, то и функция ничего не вернет. Хотя, к примеру, если нам не требуется ничего возвращать, а только выполнять какие-либо действия (мигать произвольным пикселем на экране пять секунд), то вполне подходит. По запуску функции запускается поток, который отсчитывает пять секунд. И нам по сути без разницы что там будет происходить после завершения функции. А весь код, в том числе и создания потока, лежит как раз внутри одной функции.
solar_wind
756 / 747 / 42
Регистрация: 06.07.2009
Сообщений: 2,969
Завершенные тесты: 1
30.10.2012, 12:04     Можно ли один раз создать функцию в потоке, а потом просто вызывать ее #17
SatanaXIII, Вам нужно внимательно изучать книги по теории и практике ООП. Вы подменяете и неверно интерпретируете понятия.
Это тоже самое, как утверждать, что квартира содержится в двери, ведь вы входите в нее через дверь.....
SatanaXIII
Супер-модератор
Эксперт С++
5593 / 2627 / 240
Регистрация: 01.11.2011
Сообщений: 6,461
Завершенные тесты: 1
30.10.2012, 12:07     Можно ли один раз создать функцию в потоке, а потом просто вызывать ее #18
solar_wind, поэтому я и просил пример.
solar_wind
756 / 747 / 42
Регистрация: 06.07.2009
Сообщений: 2,969
Завершенные тесты: 1
30.10.2012, 12:08     Можно ли один раз создать функцию в потоке, а потом просто вызывать ее #19
SatanaXIII, Вам пример не поможет, вам с теорией разобраться нужно, а потом уже смотреть, как это выглядит на примерах.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.10.2012, 12:09     Можно ли один раз создать функцию в потоке, а потом просто вызывать ее
Еще ссылки по теме:
C++ Как создать массив строк или символов, чтобы потом можно было с цикла его заполнить?
C++ Определить, можно ли, разломив шоколадку один раз по прямой на две части, отломить от шоколадки ровно K долек
Создать новый массив, содержащий только те элементы, которые встрачаются в исходном один раз C++
Нужно написать обход шахматной доски конем. На одну позицию можно стать один раз. Обеспечить алгоритм бектрекингу C++
C++ Подскажите метод, как вызывать get<n>(func)(x) n раз. Код внутри

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

Или воспользуйтесь поиском по форуму:
SatanaXIII
Супер-модератор
Эксперт С++
5593 / 2627 / 240
Регистрация: 01.11.2011
Сообщений: 6,461
Завершенные тесты: 1
30.10.2012, 12:09     Можно ли один раз создать функцию в потоке, а потом просто вызывать ее #20
Цитата Сообщение от solar_wind Посмотреть сообщение
квартира содержится в двери, ведь вы входите в нее через дверь
Кстати хороший пример. Серьезно.

Добавлено через 22 секунды
Цитата Сообщение от solar_wind Посмотреть сообщение
Вам пример не поможет
Может быть.
Yandex
Объявления
30.10.2012, 12:09     Можно ли один раз создать функцию в потоке, а потом просто вызывать ее
Ответ Создать тему
Опции темы

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