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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.95
BAIZOR
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68
#1

Поток внутри класса, реальность или плод моей фантазии? - C++

28.08.2011, 17:02. Просмотров 2666. Ответов 11
Метки нет (Все метки)

Дело в том, что для потока нужна статическая функция (все денные в классе НЕ статические), но будут ли независимые друг от друга потоки работать, в разных объектах класса?

И как можно реализовать доступ потока к данным его среды(объекта)?

Спасибо!

Добавлено через 3 часа 37 минут
Никто не знает ? =(
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.08.2011, 17:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Поток внутри класса, реальность или плод моей фантазии? (C++):

Новый поток внутри класса - C++
Всем привет, решил попытаться оседлать многопоточность. Но увы тут же наткнулся на полное отсутствие информации. Серьёзно, на любом...

Где объявлять переменную: перед циклом, или внутри класса - C++
Подскажите, где правильно объявить переменную. Если объявить внутри цикла, то сузится область ее видимости, но она будет объявляться...

Нужно создать базу данных (создать пустой бинарный файл). Через поток. Поток бинарного файла описать в виде локальной переменной внутри функции. - C++
Совсем не понял эту тему. Нужно создать базу данных (создать пустой бинарный файл). Через поток. Поток бинарного файла описать в виде...

Использование перегруженного оператора ввода/вывода в поток базового класса для объекта производного класса - C++
Здравствуйте! Можно ли использовать перегруженный оператор ввода/вывода в поток из базового класса для объекта производного класса, если...

Кроссплатфомернная многопоточность, миф или реальность? - C++
Доброго всем времени суток. Вопрос заключается в том, является ли thread из C++ 11 кроссплатформенным??? Если нет, то как в таком...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
villu
203 / 204 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
28.08.2011, 17:44 #2
передай в статическую функцию указатель на объект и от туда вызови то, что надо.

Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
class thread_t {
public:
    typedef void (*thread_rundown_f)(thread_t *, void *);
private:
    int             iter_;
    thread_rundown_f    rundown_;
    void                      *rundown_param_;
    pthread_t            thread_;
private:
 
    static void *_thread_func( void* instance ) {
 
        thread_t * _this = reinterpret_cast<thread_t *>(instance);
        if( 0 == _this ) return 0;
 
        thread_rundown_f rundown = _this->rundown_;
        void *rundown_param = _this->rundown_param_;
 
        _this->thread();
        if( rundown ) rundown(_this, rundown_param);
        return 0;
    }
 
public:
 
    virtual ~thread_t(){}
    thread_t()
        :iter_(0)
        ,rundown_(0)
        ,rundown_param_(0)
        ,thread_(0)
    {}
 
    void create() {
        iter_ = pthread_create( &thread_, 0, &::thread_t::_thread_func, this );
    }
    void set_rundown( thread_rundown_f rd, void * param = 0 ) {
        rundown_ = rd;
        rundown_param_ = param;
    }
private:
    virtual void thread() {}
};
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,460
28.08.2011, 18:08 #3
не компилится, споткнувшись о... да хотя бы о
C++
1
    pthread_t            thread_;
...говорит, нет такого типа- pthread_t...
0
BAIZOR
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68
28.08.2011, 18:08  [ТС] #4
Вашу идею понял,но в моем случае она не рабочая...
Во первых через pvParam уже передаеться указатель на другой не маловажный объект.
Во вторых, этот класс не имеет представления о существовании второго, так как в коде он еще не объявлен.

И мне не нужно передавать указатель на целый объект, мне было бы достаточно передать только указатель на функцию, которая находиться в объекте, того класса который по коду будет объявлен позднее...
0
villu
203 / 204 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
28.08.2011, 18:12 #5
Цитата Сообщение от kravam Посмотреть сообщение
...говорит, нет такого типа- pthread_t...
потому что линукс.
Цитата Сообщение от BAIZOR Посмотреть сообщение
Во первых через pvParam уже передаеться указатель на другой не маловажный объект.
а передать указатель на структуру с параметрами, не?
Цитата Сообщение от BAIZOR Посмотреть сообщение
И мне не нужно передавать указатель на целый объект, мне было бы достаточно передать только указатель на функцию, которая находиться в объекте, того класса который по коду будет объявлен позднее
не понял. указатель на несуществующий объект? и откуда он возьмется, как думаете?
а вообще можно и на функцию внутри объекта передать, но придется написать делегат.
Если неохота писать, то можно посмотреть boost::function + boost::bind. Но объект в этом случае должен все равно быть, да.
0
BAIZOR
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68
28.08.2011, 18:16  [ТС] #6
Цитата Сообщение от villu Посмотреть сообщение
не понял. указатель на несуществующий объект? и откуда он возьмется, как думаете?
Вызов происходит уже из этого объекта, и функция тут есть, остаеться только передать ее адресс...
вы не видите все картины, тут не так просто как кажеться.
вообщем сейчас попробую
0
villu
203 / 204 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
28.08.2011, 18:17 #7
Цитата Сообщение от BAIZOR Посмотреть сообщение
вы не видите все картины, тут не так просто как кажеться.
вообщем сейчас попробую
по мойму, я понял, но можно код, который прояснит
0
BAIZOR
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68
28.08.2011, 18:25  [ТС] #8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class CheckButton_Thread : public D3D_UI
{
private:
 
  static DWORD WINAPI ThreadFunc(PVOID pvPararn) 
  { 
    DWORD rtwResult = 0; 
 
    
    while(true)
      function((Robotino3D*)pvPararn);            // это уже указатель на другой объект
    
 
    return(rtwResult); 
  } 
public:
  void setStatus(LPVOID Object,int newstatus)
  {
    CreateThread (NULL, NULL, ThreadFunc, Object, NULL, NULL);
  }
         
};
class Robotino3D
{
public:
  vector<D3D_UI*>        UI;
 
  static bool static_f_b_Line(Robotino3D *Object)
  {
    return Object->f_b_Line();
  }
 
  bool f_b_Line()
  {
    ....
  }
};
сейчас опишу словами:

Есть большой объект класса Robotino3D
в нем есть массив типа D3D_UI.

В массиве есть много объектов детей класса D3D_UI
и у каждого ребенка есть своя индивидуальная статическая функция которая находиться в Robotino3D, и которая из-за подобных проблем так же должна принимать указатель на объект Robotino3D.

И получаеться что pvParam в функции потока уже занят указателем на Robotino3D...
хотя может создавать pair<Robotino3D, CheckButton_Thread >, но не разрушиться ли эта пара сразу после созданая, так как функция которая создает поток и собственно pair<> закрываеться... о_О


Добавлено:
функция CheckButton_Thread :: setStatus так же вызываеться из Robotino3D

Добавлено:
еще хуже...
Robotino3D находиться после D3D_UI и CheckButton_Thread.
И сделать пред объявление будет не правильным в моей ситации...

Может есть возможность передавать не указатель на весь Robotino3D, а только на функцию в нем?оО
0
villu
203 / 204 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
28.08.2011, 18:31 #9
Цитата Сообщение от BAIZOR Посмотреть сообщение
И получаеться что pvParam в функции потока уже занят указателем на Robotino3D...
еще раз: структура с указателями не подходит? или pair, да, с указателями тоже.

Цитата Сообщение от BAIZOR Посмотреть сообщение
Может есть возможность передавать не указатель на весь Robotino3D, а только на функцию в нем?оО
C++
1
2
boost::function<void()> function_from_robot;
function_from_robot = boost::bind(&Robotino3D::MyCoolFunc, &Robotino3D_object);
при условии что Robotino3D::MyCoolFunc возвращает void и принимает так же void;
и да, потом function_from_robot() - вызов. И еще ее можно по указателю передать.
0
BAIZOR
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68
28.08.2011, 18:39  [ТС] #10
я к сожалению не знаком с boost, но SDK у меня стоит, можно поподробнее что у вас в коде происходит?
0
villu
203 / 204 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
28.08.2011, 18:44 #11
Цитата Сообщение от BAIZOR Посмотреть сообщение
я к сожалению не знаком с boost, но SDK у меня стоит
boost надо отдельно от sdk ставить.
вот нашел пример прям в доках буста.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class button
{
public:
 
    boost::function<void()> onClick;
};
 
class player
{
public:
 
    void play();
    void stop();
};
 
button playButton, stopButton;
player thePlayer;
 
void connect()
{
    playButton.onClick = boost::bind(&player::play, &thePlayer);
    stopButton.onClick = boost::bind(&player::stop, &thePlayer);
}
То есть объектам кнопка устанавливается функция из другого объекта player. Если правильно понял, то то, что надо.

Можно без буста. это сделать.
вот один из примеров, например. http://www.codeproject.com/KB/cpp/fd.aspx
0
BAIZOR
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68
28.08.2011, 18:58  [ТС] #12
villu спасибо вам, в след. раз обязательно прочитаю о бусте по больше перед началом работы над проэктом.

Но у меня получилось!


я передавал указатель на Robotino3D через LPVOID всю эстафету.. пока этот указатель не вернулся в сам класс Robotino3D в статическую функцию, и тут я его переопределил, чего я раньше не додумался.. о_О
Но всем спасибо за помощь!)

Код
		#define			my__type		((pair<LPVOID, CheckButton_Thread*>*)pvPararn)


		my__type -> second -> function( my__type -> first);
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.08.2011, 18:58
Привет! Вот еще темы с ответами:

delete внутри класса для самого класса - C++
Доброго времени суток, пишу программу для работы с матрицами. По условию дали лишь несколько библиотек, ни векторов ни cstdio. Для...

Заполнение вектора класса внутри самого класса - C++
class A { private: int a; public: A() { a = 0; }; A get(vector &lt;A&gt;* vec)

BST дерево. Инициализация класса внутри класса - C++
Здравствуйте, нужно реализовать класс дерева бинарного поиска с использованием итератора. Возник вопрос, как инициализировать через...

Видимость экземпляра класса внутри класса - C++
Здравствуйте! Пытаюсь вывести openCV видео в QT виджете. На данный момент в слоте обновления картинки инициализирую класс cv::VideoCapture...


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

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

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