powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вызов функции класса из потока.
7 сообщений из 7, страница 1 из 1
Вызов функции класса из потока.
    #39922568
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеем класс вида
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
#include <thread>
class A
   {
   int a=0;
   void f1(int b)
   {
        a=b+1;
   }
   }
cA = new A();


Хотим вызвать f1 из потока
Код: plaintext
1.
2.
3.
4.
int b=5;
//cA->f1(b);
thread thrA(cA->f1, b);
thrA.detach();


Пишет ошибку -"отсутствуют экземпляры конструктора "std::thread::thread", соответствующие списку аргументов".
Пока нет потока все работает.
Пробовал создать указатель на функцию A->a и через указатель уйти в поток, обмануть типа. По синтаксису в норме, но вылезает много ошибок при компиляции.
Как запихнуть подобную A->f1 функцию в поток?

"Есть многое на свете, друг Горацио, что и не сразу в голову придет."
М. Твен "Приключения Геккельбери Финна"
...
Рейтинг: 0 / 0
Вызов функции класса из потока.
    #39922586
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это не "функция класса", а метод объекта и без указания самого объекта его вызвать нельзя.
Делай отдельную функцию или static метод и передавай туда указатель или ссылку на объект.

Примеры можешь тут посмотреть http://www.cplusplus.com/reference/thread/thread/thread/
...
Рейтинг: 0 / 0
Вызов функции класса из потока.
    #39922823
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
//cA->f1(b);
thread thrA(std::bind(&A::f1, cA, b));


Ну и естественно вам надо гарантировать что объект будет существовать пока поток с ним работает.
...
Рейтинг: 0 / 0
Вызов функции класса из потока.
    #39923127
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
Код: plaintext
1.
2.
//cA->f1(b);
thread thrA(std::bind(&A::f1, cA, b));


Ну и естественно вам надо гарантировать что объект будет существовать пока поток с ним работает.
Спасибо. Похоже, это действительно работает. Вот с синтаксисом bind() пока не разобрался.(
...
Рейтинг: 0 / 0
Вызов функции класса из потока.
    #39923128
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA,

Кстати, я забыл что конструктор std::thread умеет сам делать bind. Так что еще проще:
Код: plaintext
1.
thread thrA(&A::f1, cA, b);


(Но внутри оно делает то же самое что std::bind)

ЗЫ. std::bind это просто обертка которая применяет к первому аргументу (функции) все остальные (параметры) и возвращает новую функцию с меньшим числом аргументов (например 0 как здесь).

В данном частном случае также работает правило, что в случае если функция - это указатель на функцию-член класса (на метод), то вторым аргументом надо передать ссылку или указатель на экземпляр этого класса, а следующими аргументами уже параметры этого метода.
...
Рейтинг: 0 / 0
Вызов функции класса из потока.
    #39923137
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, да, уже умеет. Спасибо.
...
Рейтинг: 0 / 0
Вызов функции класса из потока.
    #39923144
a.guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky
Код: plaintext
1.
2.
//cA->f1(b);
thread thrA(std::bind(&A::f1, cA, b));


Код: plaintext
1.
thread thrA(&A::f1, cA, b);

для слабаков, нужно больше обёрток! Предлагаю
Код: plaintext
1.
thread thrA(std::bind(std::bind(std::bind(&A::f1, cA, b))));

т.к. бох троицу любит.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вызов функции класса из потока.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]