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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.95
BAIZOR
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68
28.08.2011, 17:02     Поток внутри класса, реальность или плод моей фантазии? #1
Дело в том, что для потока нужна статическая функция (все денные в классе НЕ статические), но будут ли независимые друг от друга потоки работать, в разных объектах класса?

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

Спасибо!

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

C++ Использование перегруженного оператора ввода/вывода в поток базового класса для объекта производного класса
Нужно создать базу данных (создать пустой бинарный файл). Через поток. Поток бинарного файла описать в виде локальной переменной внутри функции. C++
C++ delete внутри класса для самого класса
C++ Где объявлять переменную: перед циклом, или внутри класса
C++ Новый поток внутри класса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
villu
202 / 202 / 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() {}
};
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
28.08.2011, 18:08     Поток внутри класса, реальность или плод моей фантазии? #3
не компилится, споткнувшись о... да хотя бы о
C++
1
    pthread_t            thread_;
...говорит, нет такого типа- pthread_t...
BAIZOR
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68
28.08.2011, 18:08  [ТС]     Поток внутри класса, реальность или плод моей фантазии? #4
Вашу идею понял,но в моем случае она не рабочая...
Во первых через pvParam уже передаеться указатель на другой не маловажный объект.
Во вторых, этот класс не имеет представления о существовании второго, так как в коде он еще не объявлен.

И мне не нужно передавать указатель на целый объект, мне было бы достаточно передать только указатель на функцию, которая находиться в объекте, того класса который по коду будет объявлен позднее...
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
28.08.2011, 18:12     Поток внутри класса, реальность или плод моей фантазии? #5
Цитата Сообщение от kravam Посмотреть сообщение
...говорит, нет такого типа- pthread_t...
потому что линукс.
Цитата Сообщение от BAIZOR Посмотреть сообщение
Во первых через pvParam уже передаеться указатель на другой не маловажный объект.
а передать указатель на структуру с параметрами, не?
Цитата Сообщение от BAIZOR Посмотреть сообщение
И мне не нужно передавать указатель на целый объект, мне было бы достаточно передать только указатель на функцию, которая находиться в объекте, того класса который по коду будет объявлен позднее
не понял. указатель на несуществующий объект? и откуда он возьмется, как думаете?
а вообще можно и на функцию внутри объекта передать, но придется написать делегат.
Если неохота писать, то можно посмотреть boost::function + boost::bind. Но объект в этом случае должен все равно быть, да.
BAIZOR
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68
28.08.2011, 18:16  [ТС]     Поток внутри класса, реальность или плод моей фантазии? #6
Цитата Сообщение от villu Посмотреть сообщение
не понял. указатель на несуществующий объект? и откуда он возьмется, как думаете?
Вызов происходит уже из этого объекта, и функция тут есть, остаеться только передать ее адресс...
вы не видите все картины, тут не так просто как кажеться.
вообщем сейчас попробую
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
28.08.2011, 18:17     Поток внутри класса, реальность или плод моей фантазии? #7
Цитата Сообщение от BAIZOR Посмотреть сообщение
вы не видите все картины, тут не так просто как кажеться.
вообщем сейчас попробую
по мойму, я понял, но можно код, который прояснит
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, а только на функцию в нем?оО
villu
202 / 202 / 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() - вызов. И еще ее можно по указателю передать.
BAIZOR
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68
28.08.2011, 18:39  [ТС]     Поток внутри класса, реальность или плод моей фантазии? #10
я к сожалению не знаком с boost, но SDK у меня стоит, можно поподробнее что у вас в коде происходит?
villu
202 / 202 / 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.08.2011, 18:58     Поток внутри класса, реальность или плод моей фантазии?
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
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);
Yandex
Объявления
28.08.2011, 18:58     Поток внутри класса, реальность или плод моей фантазии?
Ответ Создать тему
Опции темы

Текущее время: 20:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru