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

C++

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

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

30.10.2012, 09:47. Просмотров 2718. Ответов 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
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,530
Завершенные тесты: 1
30.10.2012, 11:59 #16
solar_wind, да. Логично.
Ведь если у нас поток не завершится до завершения функции, то и функция ничего не вернет. Хотя, к примеру, если нам не требуется ничего возвращать, а только выполнять какие-либо действия (мигать произвольным пикселем на экране пять секунд), то вполне подходит. По запуску функции запускается поток, который отсчитывает пять секунд. И нам по сути без разницы что там будет происходить после завершения функции. А весь код, в том числе и создания потока, лежит как раз внутри одной функции.
0
solar_wind
756 / 747 / 42
Регистрация: 06.07.2009
Сообщений: 2,969
Завершенные тесты: 1
30.10.2012, 12:04 #17
SatanaXIII, Вам нужно внимательно изучать книги по теории и практике ООП. Вы подменяете и неверно интерпретируете понятия.
Это тоже самое, как утверждать, что квартира содержится в двери, ведь вы входите в нее через дверь.....
0
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,530
Завершенные тесты: 1
30.10.2012, 12:07 #18
solar_wind, поэтому я и просил пример.
0
solar_wind
756 / 747 / 42
Регистрация: 06.07.2009
Сообщений: 2,969
Завершенные тесты: 1
30.10.2012, 12:08 #19
SatanaXIII, Вам пример не поможет, вам с теорией разобраться нужно, а потом уже смотреть, как это выглядит на примерах.
0
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,530
Завершенные тесты: 1
30.10.2012, 12:09 #20
Цитата Сообщение от solar_wind Посмотреть сообщение
квартира содержится в двери, ведь вы входите в нее через дверь
Кстати хороший пример. Серьезно.

Добавлено через 22 секунды
Цитата Сообщение от solar_wind Посмотреть сообщение
Вам пример не поможет
Может быть.
0
KokosSPb
81 / 84 / 3
Регистрация: 03.02.2011
Сообщений: 468
31.10.2012, 12:57  [ТС] #21
Цитата Сообщение от SatanaXIII Посмотреть сообщение
KokosSPb, если наоборот разместить поток внутри функции.
То есть вызывается функция->создается поток->отрабатывает->уничтожается.
Я бы еще густо снабдил поток всевозможными задержками и передачами ресурсов головному потоку, но это смотря что он будет делать. Если что-то маленькое и не важное, то вполне.
Подскажи, ну предположим я завершу его через Abort()(?), будет это выглядеть как
C++
1
2
3
Thread^ oThread = gcnew Thread( gcnew ThreadStart(&Form1::ThreadProc));
oThread->Start();
oThread->Abort();
а успеет ли выполниться поток?
0
solar_wind
756 / 747 / 42
Регистрация: 06.07.2009
Сообщений: 2,969
Завершенные тесты: 1
31.10.2012, 13:03 #22
KokosSPb, Что значит выполниться? Он будет запущен и тут ему придет сигнал завершения и он завершится. Если ты в потоке будешь выполнять какую либо функцию, то сообщение дождется передачи управления и грохнет поток. Что успеет выполниться, а что нет, в каждом случае нужно смотреть экспериментально.
0
KokosSPb
81 / 84 / 3
Регистрация: 03.02.2011
Сообщений: 468
31.10.2012, 13:04  [ТС] #23
Ну вот я о томже а как мне грамотно разрушить поток изнутри?
0
solar_wind
756 / 747 / 42
Регистрация: 06.07.2009
Сообщений: 2,969
Завершенные тесты: 1
31.10.2012, 13:07 #24
KokosSPb, Уничтожить объект класса потока. Конкретный способ зависит от конкретной IDE
0
KokosSPb
81 / 84 / 3
Регистрация: 03.02.2011
Сообщений: 468
31.10.2012, 13:10  [ТС] #25
IDE
MicroSoft VisualStudio 2008
0
solar_wind
756 / 747 / 42
Регистрация: 06.07.2009
Сообщений: 2,969
Завершенные тесты: 1
31.10.2012, 13:21 #26
KokosSPb, Говорят что лучше использовать .RequestStop(); , но тогда поток будет ждать завершения текущей функции. Либо используй .Abort() ,тогда поток завершит выполнение при первой же передаче управления.
1
KokosSPb
81 / 84 / 3
Регистрация: 03.02.2011
Сообщений: 468
31.10.2012, 13:26  [ТС] #27
Цитата Сообщение от solar_wind Посмотреть сообщение
KokosSPb, Говорят что лучше использовать .RequestStop(); , но тогда поток будет ждать завершения текущей функции. Либо используй .Abort() ,тогда поток завершит выполнение при первой же передаче управления.
мне вроде так и нужно, только мне не найти в MSDN RequestStop()
0
solar_wind
756 / 747 / 42
Регистрация: 06.07.2009
Сообщений: 2,969
Завершенные тесты: 1
31.10.2012, 13:32 #28
KokosSPb, А ну да .RequestStop() это если ты C# используешь. Если MFC, то там кажется такой функции даже нет, там просто завершаешь функцию потока. Я уже все нюансы не помню точно, последнее время VS c Qt использую и там потоки все Qt-шные.
1
KokosSPb
81 / 84 / 3
Регистрация: 03.02.2011
Сообщений: 468
31.10.2012, 15:42  [ТС] #29
а, ну я так и делаю, понятно, спасибо

Добавлено через 1 час 43 минуты
KokosSPb, если наоборот разместить поток внутри функции.
То есть вызывается функция->создается поток->отрабатывает->уничтожается.
Я бы еще густо снабдил поток всевозможными задержками и передачами ресурсов головному потоку, но это смотря что он будет делать. Если что-то маленькое и не важное, то вполне.
Блин, а если мне надо выполнить функцию с параметрами в потоке? как мне передать значения аргументов в поток? я могу создавать поток, как функцию с аргументами? как тогда создать этот поток?
0
solar_wind
756 / 747 / 42
Регистрация: 06.07.2009
Сообщений: 2,969
Завершенные тесты: 1
31.10.2012, 18:18 #30
KokosSPb, Передаешь потоку сообщение с параметрами и все.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.10.2012, 18:18
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
30
Yandex
Объявления
31.10.2012, 18:18
Ответ Создать тему
Опции темы

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