Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

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

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

30.10.2012, 09:47. Просмотров 2796. Ответов 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. потом в мейне её вызывать - C++
Помогите. Нужно написать функцию раньше мейна, через void. потом в мейне её вызывать #include <iostream.h> #include <cstdlib.h> ...

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

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

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

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

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

31
SatanaXIII
Супер-модератор
Эксперт С++
5649 / 2693 / 252
Регистрация: 01.11.2011
Сообщений: 6,586
Завершенные тесты: 1
30.10.2012, 09:54 #2
KokosSPb, если наоборот разместить поток внутри функции.
То есть вызывается функция->создается поток->отрабатывает->уничтожается.
Я бы еще густо снабдил поток всевозможными задержками и передачами ресурсов головному потоку, но это смотря что он будет делать. Если что-то маленькое и не важное, то вполне.
0
KokosSPb
81 / 84 / 3
Регистрация: 03.02.2011
Сообщений: 468
30.10.2012, 10:08  [ТС] #3
так, я не понял ответа на свой вопрос
По поводу
Цитата Сообщение от SatanaXIII Посмотреть сообщение
То есть вызывается функция->создается поток->отрабатывает->уничтожается.
это ясно.
Но получается, что созданный поток без цикла будет единожды исполнен и далее тупо жрать ресурсы? Или он будет создан и дальнейший вызов этой функции будет выполняться в созданном ранее потоке?
0
SatanaXIII
Супер-модератор
Эксперт С++
5649 / 2693 / 252
Регистрация: 01.11.2011
Сообщений: 6,586
Завершенные тесты: 1
30.10.2012, 10:24 #4
- Если поток корректно завершился, то все ресурсы будут очищены.
- Если в самом потоке принудительно его же завершить (ExitThread) то память-то он отдаст, но на счет остального (указателей..) не уверен. Не знаю.
- Если вообще принудительно его завершить из другого потока (TeminateThread), то ничего не освободится до самого завершения процесса, содержащего поток.
- А если принудительно завалить аж процесс с незавершенным потоком, то одному богу известно, что произойдет. )
0
KokosSPb
81 / 84 / 3
Регистрация: 03.02.2011
Сообщений: 468
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
Эксперт С++
2896 / 1245 / 78
Регистрация: 27.05.2008
Сообщений: 3,411
30.10.2012, 10:42 #6
Просто "в форме." Точнее - в том потоке, который создал эту форму и обрабатывает события "нажатие кнопки" на форме (разумеется, форма тоже выполняется потоке. В любой программе есть хотя бы один поток - его еще называют "главный поток приложения").
1
SatanaXIII
Супер-модератор
Эксперт С++
5649 / 2693 / 252
Регистрация: 01.11.2011
Сообщений: 6,586
Завершенные тесты: 1
30.10.2012, 10:43 #7
Загадки во тьме.
Зачем Функции выполняться в отдельном потоке, когда ты ее будешь вызывать в обработчике кнопки, который крутится в потоке формы?

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

Что-то я не пойму в чем подвох.
0
solar_wind
757 / 748 / 42
Регистрация: 06.07.2009
Сообщений: 2,970
Завершенные тесты: 1
30.10.2012, 10:49 #8
KokosSPb,
Ты запустил поток, он привязан к классу потока. Если ты тупо вызовешь функцию из класса потока, то она будет выполняться нифига не в потоке, а там где ты ее вызвал.
Что бы функция вызвалась в потоке ты должен воспользоваться механизмом передачи сообщений. Сообщение придет в поток и поток сам вызовет нужную функцию!
1
SatanaXIII
Супер-модератор
Эксперт С++
5649 / 2693 / 252
Регистрация: 01.11.2011
Сообщений: 6,586
Завершенные тесты: 1
30.10.2012, 10:55 #9
Цитата Сообщение от solar_wind Посмотреть сообщение
Сообщение придет в поток и поток сам вызовет нужную функцию!
Зачем, когда можно запихнуть поток в функцию?
0
solar_wind
757 / 748 / 42
Регистрация: 06.07.2009
Сообщений: 2,970
Завершенные тесты: 1
30.10.2012, 11:02 #10
SatanaXIII, Потому что функцию ты запихиваешь не в поток, а в класс. А то что этот класс создает автоматически поток и запускает очередь сообщений, это уже частности.
Хочешь пиши глобальные функции и выполняй их в любом потоке, который хочешь.
Ну конечно есть библиотеки и классы, которые очень чувствительны к тому с каком потоке выполняются их функции, но это уже отдельная тема.
1
SatanaXIII
Супер-модератор
Эксперт С++
5649 / 2693 / 252
Регистрация: 01.11.2011
Сообщений: 6,586
Завершенные тесты: 1
30.10.2012, 11:06 #11
Цитата Сообщение от solar_wind Посмотреть сообщение
Потому что функцию ты запихиваешь не в поток, а в класс
Цитата Сообщение от solar_wind Посмотреть сообщение
Хочешь пиши глобальные функции и выполняй их в любом потоке
А можно по примеру. На пальцах. Для общего развития.
0
solar_wind
757 / 748 / 42
Регистрация: 06.07.2009
Сообщений: 2,970
Завершенные тесты: 1
30.10.2012, 11:10 #12
SatanaXIII, Примеры чего конкретно?
Как создавать классы?
Как создаются потоки?
Механизмов синхронизации потоков?
Если для общего развития, то в сети уже очень много и примеров и описаний этого, изучайте.
0
KokosSPb
81 / 84 / 3
Регистрация: 03.02.2011
Сообщений: 468
30.10.2012, 11:10  [ТС] #13
Цитата Сообщение от solar_wind Посмотреть сообщение
KokosSPb,
Ты запустил поток, он привязан к классу потока. Если ты тупо вызовешь функцию из класса потока, то она будет выполняться нифига не в потоке, а там где ты ее вызвал.
Что бы функция вызвалась в потоке ты должен воспользоваться механизмом передачи сообщений. Сообщение придет в поток и поток сам вызовет нужную функцию!

Спасибо, ты ответил на мой первоначальный вопрос
0
SatanaXIII
Супер-модератор
Эксперт С++
5649 / 2693 / 252
Регистрация: 01.11.2011
Сообщений: 6,586
Завершенные тесты: 1
30.10.2012, 11:14 #14
Цитата Сообщение от solar_wind Посмотреть сообщение
Если для общего развития, то в сети уже очень много и примеров и описаний этого, изучайте.
Хорошо.
0
solar_wind
757 / 748 / 42
Регистрация: 06.07.2009
Сообщений: 2,970
Завершенные тесты: 1
30.10.2012, 11:28 #15
SatanaXIII, Да, и поток в функцию ты запихнуть никак не можешь, просто потому что это совершенно разные понятия. В функции ты можешь запустить поток.
Если поток привязан к динамически созданному объекту класса, то он будет спокойно выполняться и после завершения этой твоей функции. А если объект класса потока статический, то после завершения функции будет вызван деструктор, который уничтожит объект, а тот в свою очередь уничтожит привязанный к нему поток, ведь потоком все равно кто то должен управлять.
0
30.10.2012, 11:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.10.2012, 11:28
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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