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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
Warezovvv
 Аватар для Warezovvv
9 / 9 / 2
Регистрация: 09.12.2012
Сообщений: 219
17.07.2014, 19:00     Std::thread, создать указатель на член класса #1
Есть класс
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-> ???
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
17.07.2014, 19:45     Std::thread, создать указатель на член класса #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
std::thread t(&MyClass::MyMethod, this, args);
и вообще поток лучше запускать из вне класса SquareSolver.
SquareSolver не должен быть зависимым от std::thread
Warezovvv
 Аватар для Warezovvv
9 / 9 / 2
Регистрация: 09.12.2012
Сообщений: 219
17.07.2014, 19:51  [ТС]     Std::thread, создать указатель на член класса #3
Но ведь мне нужно разработать класс, который считает квадратное уравнение при помощи потоков. Как поток не поместить в класс? И почему не должен быть зависимым?
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
17.07.2014, 19:59     Std::thread, создать указатель на член класса #4
Цитата Сообщение от Warezovvv Посмотреть сообщение
Но ведь мне нужно разработать класс, который считает квадратное уравнение при помощи потоков. Как поток не поместить в класс?
ну создай ещё один класс который будет запускать метод SquareSolver в другом потоке.

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

Добавлено через 42 секунды
да и смысл создавать поток и тут же его join-ить
Warezovvv
 Аватар для Warezovvv
9 / 9 / 2
Регистрация: 09.12.2012
Сообщений: 219
17.07.2014, 20:24  [ТС]     Std::thread, создать указатель на член класса #5
Цитата Сообщение от Jupiter Посмотреть сообщение
да и смысл создавать поток и тут же его join-ить
В том и смысл что я разбираюсь пока. Мне надо просто распараллелить вычисления, не зависимые друг от друга. Я как то не правильно делаю?
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
17.07.2014, 20:48     Std::thread, создать указатель на член класса #6
Цитата Сообщение от Warezovvv Посмотреть сообщение
Я как то не правильно делаю?
ты на каждой итерации цикла создаешь поток и ожидаешь его завершения т.е. следующая итерация не начнется пока не закончится предыдущая т.е. вычисляется все последовательно
Warezovvv
 Аватар для Warezovvv
9 / 9 / 2
Регистрация: 09.12.2012
Сообщений: 219
17.07.2014, 20:50  [ТС]     Std::thread, создать указатель на член класса #7
Так и знал что вычисляются они последовательно. Надо мной знакомый посмеялся и сказал что я ерунду говорю.
Т.е. нужно асинхронно запустить?
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
17.07.2014, 21:02     Std::thread, создать указатель на член класса #8
Цитата Сообщение от Warezovvv Посмотреть сообщение
Т.е. нужно асинхронно запустить?
нужно сначала запустить все потоки, а потом джоинить
Warezovvv
 Аватар для Warezovvv
9 / 9 / 2
Регистрация: 09.12.2012
Сообщений: 219
17.07.2014, 21:03  [ТС]     Std::thread, создать указатель на член класса #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();
Или типо такого
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
17.07.2014, 21:10     Std::thread, создать указатель на член класса #10
Warezovvv, именно
Warezovvv
 Аватар для Warezovvv
9 / 9 / 2
Регистрация: 09.12.2012
Сообщений: 219
17.07.2014, 21:12  [ТС]     Std::thread, создать указатель на член класса #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
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
17.07.2014, 21:28     Std::thread, создать указатель на член класса #12
надо пройтись отладчиком. если просто запустить SquareSolver::squareExp, без потоков, все работает?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.07.2014, 21:33     Std::thread, создать указатель на член класса
Еще ссылки по теме:

Как создать указатель на функцию-член класса и вызвать его? C++
C++ Указатель на член структуры/класса
Указатель на функцию-член класса C++

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

Или воспользуйтесь поиском по форуму:
Warezovvv
 Аватар для Warezovvv
9 / 9 / 2
Регистрация: 09.12.2012
Сообщений: 219
17.07.2014, 21:33  [ТС]     Std::thread, создать указатель на член класса #13
Jupiter, да. Пока писал ответ, еще раз прошелся и отладчиком и понял что я дурачок. Со скобками намутил. Второй цикл находится еще в первом :} Сейчас создам отдельный топик с оценкой моей ерунды))
Yandex
Объявления
17.07.2014, 21:33     Std::thread, создать указатель на член класса
Ответ Создать тему
Опции темы

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