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

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

Войти
Регистрация
Восстановить пароль
 
Shaman163
4 / 4 / 0
Регистрация: 22.12.2011
Сообщений: 134
#1

Новый поток внутри класса - C++

21.08.2013, 13:32. Просмотров 925. Ответов 12
Метки нет (Все метки)

Всем привет, решил попытаться оседлать многопоточность. Но увы тут же наткнулся на полное отсутствие информации.
Серьёзно, на любом посещённом мною ресурсе описывается либо теоретическая часть (которая мне вроде бы и так понятна),
либо сильно замудрённая практическая (которая уже требует каких то минимальных знаний).
И ни где толком не объясняется как именно реализовывать многопоточность. В частности меня интересует вопрос, как запустить виртуальный метод класса в отдельном потоке?
В качестве среды разработки использую QT Creator 2.7 MinGW32 (разумеется без использования самой QT)
Вот пример(вполне рабочий) исполнения метода в отдельном потоке который я всё таки откопал где то:
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
void Build( void* pParams)
{
 
}
int main()
{
    _beginthread(Build, 0, NULL );
    return 0;
}
Однако, стоит запихать всё это в класс:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class Base
{
public:
 
    void Build( void* pParams)
    {
 
    }
    Base()
    {
        _beginthread(Build, 0, NULL );
    }
};
Получаем ошибку...
<<cannot convert 'Base::Build' from type 'void (Base:: )(void*)' to type 'void (__attribute__((__cdecl__)) *)(void*)'>>

Помогите пожалуйста, и если не трудно скиньте хороший ресурс(не книгу) по теме, чтобы впредь подобных тем не писать..
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.08.2013, 13:32     Новый поток внутри класса
Посмотрите здесь:

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

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

Инициализация класса A внутри класса B - C++
заранее извиняюсь, наверняка подобное было на одной из 1000 страниц=)... есть 2 класса //собственно первый класс class matrix ...

Нужно закрыть поток thread и открыть новый для sleep - C++
// Text string copied from RJ TextEd char* szRaw = &quot; /Thread...java/lang/Throwable..1 javax/microedition/io/Connection ...

Ошибка в шаблоне класса (вывод в поток) - C++
Помогите пожалуйста понять что не так: // list.h template&lt;class K, class V&gt; class List { public: ... template...

Вывод данных в поток у наследованного класса - C++
Доброе время суток. Подскажите, как в С++ вывести данные унаследованного класса при помощи потока ostream. Как я прочитал в...

Ошибка при добавлении экземпляра класса в поток - C++
Добрый день, возникла ошибка при добавлении екземпляра класса в поток, не могу разобраться, прилагаются скрины! П.5.18.Правил ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт С++
6552 / 3972 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.08.2013, 13:43     Новый поток внутри класса #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
#include <iostream>
 
class Base
{
public:
    void DoSomething()
    {
 
    }
 
    Base()
    {
    }
};
 
void Build(void* pParams)
{
    Base* ptr = static_cast<Base*>(pParams);
    ptr->DoSomething();
}
 
int main()
{
    Base obj;
    _beginthread(Build, 0, &obj);
    return 0;
}
Croessmah
Модератор
Эксперт CЭксперт С++
12979 / 7291 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
21.08.2013, 13:49     Новый поток внутри класса #3
Цитата Сообщение от Shaman163 Посмотреть сообщение
Серьёзно, на любом посещённом мною ресурсе описывается либо теоретическая часть
http://www.ozon.ru/context/detail/id/17636939/
Shaman163
4 / 4 / 0
Регистрация: 22.12.2011
Сообщений: 134
21.08.2013, 13:59  [ТС]     Новый поток внутри класса #4
Цитата Сообщение от Jupiter Посмотреть сообщение
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
#include <iostream>
 
class Base
{
public:
    void DoSomething()
    {
 
    }
 
    Base()
    {
    }
};
 
void Build(void* pParams)
{
    Base* ptr = static_cast<Base*>(pParams);
    ptr->DoSomething();
}
 
int main()
{
    Base obj;
    _beginthread(Build, 0, &obj);
    return 0;
}
Так в том то и соль, что мне нужна реализация именно внутри класса.
От Base будут наследоваться другие классы внутри которых будут расчёты больших объёмов данных они то в свою очередь и должны исполнятся в отдельных потоках.
По моей задумке должен быть общих метод Build содержимое которого я буду переписывать в зависимости от наследника, однако исполнение его будет в отдельном потоке.
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 1
21.08.2013, 14:19     Новый поток внутри класса #5
при чём тут вообще наследование?
Jupiter
Каратель
Эксперт С++
6552 / 3972 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.08.2013, 14:21     Новый поток внутри класса #6
Цитата Сообщение от Shaman163 Посмотреть сообщение
Так в том то и соль, что мне нужна реализация именно внутри класса.
вы никак не засунете метод класса в beginthread

Цитата Сообщение от Shaman163 Посмотреть сообщение
От Base будут наследоваться другие классы внутри которых будут расчёты больших объёмов данных они то в свою очередь и должны исполнятся в отдельных потоках.
По моей задумке должен быть общих метод Build содержимое которого я буду переписывать в зависимости от наследника, однако исполнение его будет в отдельном потоке.
отлично, в чем проблема?

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
#include <iostream>
 
void Build(void* pParams); 
 
class Base
{
public:
    virtual ~Base() {}
    
    virtual void Build()
    {
        std::cout << "Base::Build" << std::endl;
    }
    
    void Run()
    {
        _beginthread(::Build, 0, this);
    }
};
 
class Derived : public Base
{
public:
    virtual ~Derived() {}
    
    virtual void Build()
    {
        std::cout << "Derived::Build" << std::endl;
    }
};
 
void Build(void* pParams)
{
    Base* ptr = static_cast<Base*>(pParams);
    ptr->Build();
}
 
int main()
{
    Derived obj;
    obj.Run();
    return 0;
}
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
21.08.2013, 19:04     Новый поток внутри класса #7
std::thread
Shaman163
4 / 4 / 0
Регистрация: 22.12.2011
Сообщений: 134
27.08.2013, 14:51  [ТС]     Новый поток внутри класса #8
Окей, другой вопрос. Как в таком случае уберечь Base::Build от вызова из вне???
Он ведь публичный...
Да и метод потока хотелось бы уберечь от возможности вызова не из конструктора Base
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
27.08.2013, 14:53     Новый поток внутри класса #9
Не понял вопроса, конкретизируй - постараюсь помочь.
Shaman163
4 / 4 / 0
Регистрация: 22.12.2011
Сообщений: 134
27.08.2013, 15:23  [ТС]     Новый поток внутри класса #10
Вот мой код:
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
void Thread(void* pParams);
 
class Base
{
public:
    virtual void Build()
    {
        cout << "Base" << endl;
    }
    Base()
    {
        _beginthread(::Thread,0,this);
    }
};
 
class Image : Base
{
public:
    virtual void Build()
    {
        cout << "Image" << endl;
    }
 
};
 
void Thread(void* pParams)
{
    Base* ptr = static_cast<Base*>(pParams);
    ptr->Build();
}
1) Проблема в том что Build() обязательно должен быть публичным, однако я хочу ограничить возможность его вызова. Иначе говоря он должен вызываться только в конструкторе Base и нигде более
2) С методом Thread() аналогично...
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
27.08.2013, 15:27     Новый поток внутри класса #11
В конструкторе Base его корректно вызывать не получится, так как будет вызываться только Base::Build, но не Build, переопределенный в наследниках.
Придется сделать какой-то метод типа Base::start, который и будет запускать Build в отдельном потоке.
Raali
622 / 326 / 34
Регистрация: 06.07.2013
Сообщений: 1,054
Завершенные тесты: 1
27.08.2013, 16:51     Новый поток внутри класса #12
Вот как то так

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
#include <process.h>
#include <iostream>
 
class Base;
typedef void (*func_type)(void*);
 
class Base
{
public:
 
    static void Build( void* pParams) {std::cout << "Base\n";};
 
    void Init(func_type f) 
    {
        _beginthread(f, 0,(void*)this);
    }
 
    Base(func_type f)
    {
        Init(f);
    }
 
    Base()  {Init(Base::Build);}
 
};
 
class Inherited : public Base
{
 
    static void Build(void* pParams){std::cout << "Inherited\n";}
 
    public:
    Inherited() : Base(Inherited::Build) {}
};
 
 
 
int main()
{
    Base b; // пишет "Base"
    Inherited i; // пишет "Inherited"
    system("pause");
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.08.2013, 18:35     Новый поток внутри класса
Еще ссылки по теме:

Потоки и указатели (в поток вставить объект класса) - C++
Есть структура: class shapka{ public: int* prev; int n; int* next; } }; Нужно в поток вставить объект класса, потом...

Перегрузить операторы взятия из потока и помещения в поток у класса - C++
Имею такое задание: нужно написать класс с функциями сохранения в файл и чтения из файла набора экземпляров класса . У класса должны быть...

Можно ли создать поток для нестатического метода класса? - C++
Можно ли создать поток для не статик метода класса? #include &lt;windows.h&gt; #include &lt;stdio.h&gt; class MYCLASS { private : int...

Разработать шаблон класса для вывода вектора данных в поток - C++
Разработать шаблон соответствующего класса, где поля могут иметь различные типы данных. Предусмотреть наличие в классе указанных методов и...

Класс внутри класса - C++
Добрый вечер! Имею вот что: class Outer { public: double y ; class Inner


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

Или воспользуйтесь поиском по форуму:
Shaman163
4 / 4 / 0
Регистрация: 22.12.2011
Сообщений: 134
28.08.2013, 18:35  [ТС]     Новый поток внутри класса #13
Цитата Сообщение от Герц Посмотреть сообщение
В конструкторе Base его корректно вызывать не получится, так как будет вызываться только Base::Build, но не Build, переопределенный в наследниках.
Придется сделать какой-то метод типа Base::start, который и будет запускать Build в отдельном потоке.
Либо вы не правы, либо я чего то не допонял, тот код что я предоставил, корректно работает..
В консоли я вижу как Base так и Image. В теории как я понимаю, в конструкторе вызывается последнее переопределение до текущего наследника, в моём случае это Image.
На всякий случай, вот последняя версия кода:
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
#include <iostream>
 
using namespace std;
 
void Thread(void* pParams);
 
class Base
{
public:
    virtual void Build()
    {
        cout << "Base" << endl;
    }
    Base()
    {
        _beginthread(::Thread,0,this);
    }
};
 
class Image : Base
{
public:
    virtual void Build()
    {
        cout << "Image" << endl;
    }
 
};
 
void Thread(void* pParams)
{
    Base* ptr = static_cast<Base*>(pParams);
    ptr->Build();
}
 
int main()
{
    Base b1;
    Image b2;
    system("pause");
    return 0;
}
Цитата Сообщение от Raali Посмотреть сообщение
Вот как то так
Большое спасибо за пример, как только разберусь в коде отпишусь о результатах.
Yandex
Объявления
28.08.2013, 18:35     Новый поток внутри класса
Ответ Создать тему
Опции темы

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