Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.92/25: Рейтинг темы: голосов - 25, средняя оценка - 4.92
51 / 50 / 14
Регистрация: 17.11.2012
Сообщений: 427
1

Создание потока в классе

02.05.2016, 10:09. Просмотров 5202. Ответов 8
Метки нет (Все метки)


Всем здрасьте !

Меня волнует вопрос:
Как создать поток в классе ?

Находил много реализаций, но они уж что-то громоздкие, аж на 200 строк кода + 20 в своём.
Во всех реализациях мне надо было наследовать мой класс от другого.

Объясните мне, почему я не могу как обычно вызвать в классе CreateThread(), а описание входной функции для THREAD вне класса ?
И если можно, источник на не большой код, как запустить поток в классе.
Заранее благодарен !
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.05.2016, 10:09
Ответы с готовыми решениями:

Функция потока в классе
Подскажите, как запихать в класс функцию потока (небольшой пример, если есть)? когда пишу так:...

По поводу потока и перегрузки оператора вставки в классе
#include <iostream> using namespace std; class three_d { public: int x, y, z; three_d(int a,...

Перегрузка операторов ввода и вывода из потока в шаблонном классе
Доброго времени суток. Пишу свой вектор. В нём надо перегрузить вышеназванные операторы. Vector.h...

Создание потока в классе
Здравствуйте. Хочу написать программу, которая бы общалась по нескольким com-портам с разными...

__________________
Помогаю в написании студенческих работ здесь.
Записывайтесь на профессиональные курсы C++ разработчиков
8
44 / 44 / 19
Регистрация: 04.05.2014
Сообщений: 190
02.05.2016, 10:19 2
Лучший ответ Сообщение было отмечено BeginerMan как решение

Решение

Предпочтительно использовать класс std::thread для работы с потоками. Следует передать в него функцию и её аргументы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <utility>
#include <thread>
#include <functional>
 
void f1(int n)
{
    for(int i=0; i<5; ++i) {
        ++n;
    }
}
 
int main()
{
    int n = 0;
    std::thread t1(f1, n);
    t1.join();
}
0
51 / 50 / 14
Регистрация: 17.11.2012
Сообщений: 427
02.05.2016, 18:56  [ТС] 3
Т.е. такой код вполне сойдёт за годный ? (рабочий)
Кликните здесь для просмотра всего текста
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
#include <thread>
#include <iostream>
 
using namespace std;
 
 
void MyFunc()
{
    cout << this_thread::get_id() << endl;
    this_thread::sleep_for(chrono::seconds(2));
}
 
 
class A
{
public:
    A(int a)
    {
        this->a = a;
    }
 
    void CreateThr()
    {
        thread thr(MyFunc);
        thr.join();
        cout << "End" << endl;
    }
    
private:
    int a;
};
 
 
int main()
{
    A a(5);
    a.CreateThr();
 
    system("pause");
    return 0;
}

И можно мне как-нибудь положить MyFunc в класс ?
0
6918 / 5983 / 2710
Регистрация: 14.04.2014
Сообщений: 25,504
02.05.2016, 19:00 4
Работает или нет?
Функцию попробуй сделать static внутри класса.
0
44 / 44 / 19
Регистрация: 04.05.2014
Сообщений: 190
02.05.2016, 19:01 5
BeginerMan, почти. Создавать поток, и потом сразу вызывать функцию join для ожидания его завершения не имеет смысла на практике. Обычно join вызывают в деструкторе класса или там, где это нужно по смыслу. Ну и в функцию MyFunc обычно передают указатель this класса для удобства. Но всё это зависит от целей и задач.
0
51 / 50 / 14
Регистрация: 17.11.2012
Сообщений: 427
02.05.2016, 19:39  [ТС] 6
Объявление ф-ии со static внутри класса помогло.

Я как понял, join - приостанавливает текущ. поток и ждёт пока завершится который я создал с std::thread.
Но я буду использовать detach - по-моему он просто отделяет поток(делает его фоновым вроде).

Теперь такой код:
Кликните здесь для просмотра всего текста
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
44
#include <thread>
#include <iostream>
 
using namespace std;
 
 
class A
{
public:
    A(int a)
    {
        this->a = a;
    }
 
    void CreateThr()
    {
        cout << a << endl;
        thread thr(MyFunc, this);
        thr.detach();
        
        cout << "End" << endl;
    }
    
private:
    int a;
 
    static void MyFunc(A* &p)
    {
        p->a = 6;
        cout << p->a << endl;
        this_thread::sleep_for(chrono::seconds(2));
    }
 
};
 
 
int main()
{
    A a(5);
    a.CreateThr();
 
    system("pause");
    return 0;
}


Но он ругается. По-моему на this в аргументе при создании thread.
0
44 / 44 / 19
Регистрация: 04.05.2014
Сообщений: 190
02.05.2016, 19:43 7
Должно быть не "A* &p", а "A* p".
1
6918 / 5983 / 2710
Регистрация: 14.04.2014
Сообщений: 25,504
02.05.2016, 19:45 8
C++
1
MyFunc(A * p)
1
51 / 50 / 14
Регистрация: 17.11.2012
Сообщений: 427
02.05.2016, 19:55  [ТС] 9
Спасибо ! теперь работает всё как надо !
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.05.2016, 19:55

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

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

Запуск потока в классе
Никак не могу разобраться с потоками. Вообщем мне нужно каждые 2 секунды в потоке вызывать метод...

Создание нового потока из работающего потока
насколько это корректно? вроде всё нормально работает и именно так как задумывалось, но вопрос...

Создание потока из потока.
Надо создать поток 1, в нем создать поток 2, сам я жуткий дураг, немаловероятно что правильного в...


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

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

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