Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/22: Рейтинг темы: голосов - 22, средняя оценка - 4.50
9 / 9 / 3
Регистрация: 09.12.2012
Сообщений: 219
1

Std::thread, создать указатель на член класса

17.07.2014, 19:00. Показов 4241. Ответов 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
#pragma once
 
#include <map>
#include <vector>
#include <string>
#include <thread>
//This class allows to calculate quadratic equation
class SquareSolver {
public:
    SquareSolver(int argc, const char* argv[]);
    std::map<std::vector<double>,
             std::vector<double>> getContainer() const;
private: //functions
    void                            usage() const;              
    void                            proceed(int argc,const char** argv);
    bool                            isDigitSet(int argc, const char** argv);
    void                            fillMap();
    const char *                    errorMessage(int i) const;
    void                            squareSolve();
    void                            squareExp(std::map< std::vector<double>, std::vector<double> >::iterator& cur);
private: //variables
    std::vector<double>             income, answer;
    std::map<std::vector<double>,
             std::vector<double>>   set; //The set of associations      
    static const char *             errorStrings[];
    enum                            errorCode {
                                        notDouble,
                                        notSolved
                                        };
};
И функция, которая запускает потоки.
C++
1
2
3
4
5
6
7
//Main solve function
void SquareSolver::squareSolve() {   
    for(auto cur = this->set.begin();cur != this->set.end(); cur++) {       
        std::thread solverThread(squareExp,std::ref(cur));
        solverThread.join();
    }
}
Когда я писал без класса. Модульно. Все работало. Теперь же пишет

SquareSolver::squareExp': function call missing argument list; use '&SquareSolver::squareExp' to create a pointer to member
Почему не this-> ???
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.07.2014, 19:00
Ответы с готовыми решениями:

std::bind и указатель на статическую функцию член класса
Биндинг простых функций класса-это понятно, а вот как быть, если функция статическая?

Не могу создать указатель на перегруженную функцию-член класса
Есть функция монстр из vulkan api. Она является членом класса. Просто написать её название не...

Как создать указатель на функцию-член класса и вызвать его?
Подскажите как правильно сделать, а в дальнейшем вызвать указатель на функцию член класса:...

Не могу создать указатель на функцию. ошибка: нестандартный синтаксис; используйте "&", чтобы создать указатель на член
Выбивает ошибку, когда хочу присвоить переменной адрес какой то функции. Ошибка в строке 28(если...

__________________

Записывайтесь на профессиональные курсы C++ разработчиков
12
Каратель
Эксперт С++
6598 / 4017 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
17.07.2014, 19:45 2
Лучший ответ Сообщение было отмечено Warezovvv как решение

Решение

C++
1
std::thread t(&MyClass::MyMethod, this, args);
и вообще поток лучше запускать из вне класса SquareSolver.
SquareSolver не должен быть зависимым от std::thread
1
9 / 9 / 3
Регистрация: 09.12.2012
Сообщений: 219
17.07.2014, 19:51  [ТС] 3
Но ведь мне нужно разработать класс, который считает квадратное уравнение при помощи потоков. Как поток не поместить в класс? И почему не должен быть зависимым?
0
Каратель
Эксперт С++
6598 / 4017 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
17.07.2014, 19:59 4
Цитата Сообщение от Warezovvv Посмотреть сообщение
Но ведь мне нужно разработать класс, который считает квадратное уравнение при помощи потоков. Как поток не поместить в класс?
ну создай ещё один класс который будет запускать метод SquareSolver в другом потоке.

Цитата Сообщение от Warezovvv Посмотреть сообщение
И почему не должен быть зависимым?
Принцип единственной ответственности

Добавлено через 42 секунды
да и смысл создавать поток и тут же его join-ить
1
9 / 9 / 3
Регистрация: 09.12.2012
Сообщений: 219
17.07.2014, 20:24  [ТС] 5
Цитата Сообщение от Jupiter Посмотреть сообщение
да и смысл создавать поток и тут же его join-ить
В том и смысл что я разбираюсь пока. Мне надо просто распараллелить вычисления, не зависимые друг от друга. Я как то не правильно делаю?
0
Каратель
Эксперт С++
6598 / 4017 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
17.07.2014, 20:48 6
Цитата Сообщение от Warezovvv Посмотреть сообщение
Я как то не правильно делаю?
ты на каждой итерации цикла создаешь поток и ожидаешь его завершения т.е. следующая итерация не начнется пока не закончится предыдущая т.е. вычисляется все последовательно
1
9 / 9 / 3
Регистрация: 09.12.2012
Сообщений: 219
17.07.2014, 20:50  [ТС] 7
Так и знал что вычисляются они последовательно. Надо мной знакомый посмеялся и сказал что я ерунду говорю.
Т.е. нужно асинхронно запустить?
0
Каратель
Эксперт С++
6598 / 4017 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
17.07.2014, 21:02 8
Цитата Сообщение от Warezovvv Посмотреть сообщение
Т.е. нужно асинхронно запустить?
нужно сначала запустить все потоки, а потом джоинить
0
9 / 9 / 3
Регистрация: 09.12.2012
Сообщений: 219
17.07.2014, 21:03  [ТС] 9
C++
1
2
3
4
 for(int i = 0; i < 5; ++i)
          threads.push_back(std::thread(workerFunc, i+1, std::ref(generator)));
     for(auto &t: threads)
          t.join();
Или типо такого
0
Каратель
Эксперт С++
6598 / 4017 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
17.07.2014, 21:10 10
Warezovvv, именно
0
9 / 9 / 3
Регистрация: 09.12.2012
Сообщений: 219
17.07.2014, 21:12  [ТС] 11
C++
1
2
3
4
5
6
7
8
9
//Main solve function
void SquareSolver::squareSolve() {   
    std::vector<std::thread> pool;
    for(auto cur = this->set.begin();cur != this->set.end(); cur++) {       
        pool.push_back(std::thread(&SquareSolver::squareExp,this,std::ref(cur)));
    for(auto &thread : pool)
        thread.join();
    }
}
выкидывает exception unhandled
0
Каратель
Эксперт С++
6598 / 4017 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
17.07.2014, 21:28 12
надо пройтись отладчиком. если просто запустить SquareSolver::squareExp, без потоков, все работает?
0
9 / 9 / 3
Регистрация: 09.12.2012
Сообщений: 219
17.07.2014, 21:33  [ТС] 13
Jupiter, да. Пока писал ответ, еще раз прошелся и отладчиком и понял что я дурачок. Со скобками намутил. Второй цикл находится еще в первом :} Сейчас создам отдельный топик с оценкой моей ерунды))
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.07.2014, 21:33

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

Std::thread шаблон класса
Как так получается что мы используем конструктор шаблонного класса std::thread без передачи...

Указатель на ф-цию член класса
Чёрная магия или я бот? g++ sub.cpp:21: error: expected unqualified-id before ‘*’ token...

Указатель на член структуры/класса
Всем привет! Помогите разобраться. Пусть есть такой код: template &lt;typename Type&gt; class...

Указатель на функцию - член класса.
делаю так: class c1 { void foo(); } class c2 { void (*fp)();


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

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

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