Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Satansoft
8 / 8 / 1
Регистрация: 27.02.2012
Сообщений: 724
#1

Обращение потока к функции-члену класса - C++

19.11.2014, 23:34. Просмотров 703. Ответов 22
Метки нет (Все метки)

Есть Класс MainWindow, функцией-членом которой выступает Reader(), при попытке обратиться поток к данной функции-члену из main'a через экземпляр класса w

C++
1
2
3
4
for(i=0;i<M;i++)
        {
           RE[i] = std::thread(w.Reader);;
        }
сыпется ошибка

no matching function for call to 'std::thread::thread(<unresolved overloaded function type>)
возможно функция thread не понимает такое обращение, тогда как понимает?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2014, 23:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обращение потока к функции-члену класса (C++):

Обращение к приватному члену класса внутри пространства имён - C++
Здравствуйте. Вот у меня есть код: #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;vector&gt; #include &lt;string&gt; using namespace...

Доступ к функции-члену другого класса - C++
Каким образом можно получить доступ из одного класса к функции члену другого класса???

Не хватает прав доступа к закрытому члену класса из дружественной функции - C++
Здравтсвуйте. Есть класс LifeMap. файл LifeMap.hpp #ifndef LIFEMAP_HPP #define LIFEMAP_HPP /* * LifeMap - класс для...

Обращение к члену protected - C++
Добрый день, помогите разобраться Обращение к члену protected, сообщается ошибкой Код класса: #include &lt;iostream&gt; #include &lt;string&gt;...

Обращение к члену структуры - C++
В чем разница между: a-&gt;b и a.b

Обращение к члену связного списка - C++
Прошу помощи в решении Стоит задача обращения к члену связного списка(того списка что выводится на экран файлового менеджера),затем с...

22
Max Dark
шКодер самоучка
1851 / 1651 / 603
Регистрация: 09.10.2013
Сообщений: 3,678
Записей в блоге: 6
Завершенные тесты: 2
19.11.2014, 23:51 #2
std::bind
C++
1
std::thread(std::bind(&(decltype(w)::Reader), w));
0
Satansoft
8 / 8 / 1
Регистрация: 27.02.2012
Сообщений: 724
20.11.2014, 00:01  [ТС] #3
Cra3y,

?
C++
1
#include <functional>
?
C++
1
2
3
4
for(i=0;i<N;i++)
        {
           WR[i] = std::thread(std::bind(&(decltype(w)::Reader), w));
        }
invalid use of non-static member function 'int MainWindow::Writer()
0
Max Dark
шКодер самоучка
1851 / 1651 / 603
Регистрация: 09.10.2013
Сообщений: 3,678
Записей в блоге: 6
Завершенные тесты: 2
20.11.2014, 00:04 #4
хотя и без bind можно
C++
1
    std::thread(&decltype(w)::Reader,w);
http://ideone.com/aIoezC
0
Satansoft
8 / 8 / 1
Регистрация: 27.02.2012
Сообщений: 724
20.11.2014, 00:21  [ТС] #5
Cra3y, даже ваш пример не запускается, интересно, почему...
ни VS2012 ни mingw этот вариант не нравится... порядка 16 ошибокъ
0
Max Dark
шКодер самоучка
1851 / 1651 / 603
Регистрация: 09.10.2013
Сообщений: 3,678
Записей в блоге: 6
Завершенные тесты: 2
20.11.2014, 00:34 #6
Нужна поддержка C++11
для MinGW добавьте параметр -std=c++11
для VS2012 я не знаю
decltype я использовал, т.к. не было указано какого типа переменная w
попробуйте заменить decltype(w) на имя типа
0
Satansoft
8 / 8 / 1
Регистрация: 27.02.2012
Сообщений: 724
20.11.2014, 00:43  [ТС] #7
Цитата Сообщение от Cra3y Посмотреть сообщение
Нужна поддержка C++11
Она присутствует, иначе как бы я thread юзал в VS2012. В mingw тоже присутствует эта поддержка.
w- экземпляр класса, объявленный в main.

класс
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
class MainWindow
{
public:
    std::mutex mutex1, mutex2, mutex3, w, r;
    unsigned int readers = 0;
    unsigned int writers = 0;
 
    int Reader()
    {
        while(true)
        {
        mutex3.lock();
        r.lock();
        mutex1.lock();
        readers++;
        if(readers==1) w.lock();
        mutex1.unlock();
        r.unlock();
        mutex3.unlock();
         //вывод QWidget дейсвия читателя
        mutex1.lock();
        readers--;
        if(readers==0) w.unlock();
        mutex1.unlock();
        }
     return 0;
 
    }
        ~MainWindow();
};
вызов
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int main(int argc, char *argv[])
{
    MainWindow w;
 
    std::thread WR[N];
    std::thread RE[M];
    int i;
 
        for(i=0;i<M;i++)
        {
           RE[i] = std::thread(&decltype(w)::Reader,w);
        }
 
 
        for(i=0;i<M;i++)
        {
            RE[i].join();
        }
    return 0;
}
0
Max Dark
шКодер самоучка
1851 / 1651 / 603
Регистрация: 09.10.2013
Сообщений: 3,678
Записей в блоге: 6
Завершенные тесты: 2
20.11.2014, 00:46 #8
А ошибки выложить?)
0
Satansoft
8 / 8 / 1
Регистрация: 27.02.2012
Сообщений: 724
20.11.2014, 00:48  [ТС] #9
Цитата Сообщение от Cra3y Посмотреть сообщение
А ошибки выложить?)
На 2 монитора не влазят, а с bind только одна

invalid use of non-static member function 'int MainWindow::Reader()
0
Max Dark
шКодер самоучка
1851 / 1651 / 603
Регистрация: 09.10.2013
Сообщений: 3,678
Записей в блоге: 6
Завершенные тесты: 2
20.11.2014, 00:53 #10
C++
1
std::thread(std::bind(&decltype(w)::Reader, &w));
выложите весь проект архивом, только почистите от бинарников(Сборка->Очистить решение)
0
Satansoft
8 / 8 / 1
Регистрация: 27.02.2012
Сообщений: 724
20.11.2014, 01:00  [ТС] #11
Cra3y, это Qt проект с логикой полностью на С++11, с Qt только интерфейс.
0
Вложения
Тип файла: 7z Parallel.7z (333.2 Кб, 3 просмотров)
Max Dark
шКодер самоучка
1851 / 1651 / 603
Регистрация: 09.10.2013
Сообщений: 3,678
Записей в блоге: 6
Завершенные тесты: 2
20.11.2014, 01:17 #12
в файле проекта заменил
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#-------------------------------------------------
#
# Project created by QtCreator 2014-11-16T20:12:26
#
#-------------------------------------------------
 
QT       += core gui
 
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
 
TARGET = YeeP
TEMPLATE = app
 
 
SOURCES += main.cpp\
        mainwindow.cpp
 
HEADERS  += mainwindow.h
 
FORMS    += mainwindow.ui
#CONFIG += c++11
QMAKE_CXXFLAGS   += -std=c++11
и в mainwindow.cpp
C++ (Qt)
1
2
3
4
void MainWindow::on_pushButton_clicked()
{
        //main();
}
и у меня все собралось
QT 4.8.2 x64
g++ (Debian 4.7.2-5) 4.7.2
1
Satansoft
8 / 8 / 1
Регистрация: 27.02.2012
Сообщений: 724
20.11.2014, 01:28  [ТС] #13
Cra3y, но разве запустилось?

Добавлено через 4 минуты
И невозможность вызвать main()...
0
Max Dark
шКодер самоучка
1851 / 1651 / 603
Регистрация: 09.10.2013
Сообщений: 3,678
Записей в блоге: 6
Завершенные тесты: 2
20.11.2014, 01:31 #14
запустилось, но вы не в том месте потоки создаете
у вас они друг друга лочат
а join ждет их завершения, учитывая что у вас циклы в потоках бесконечные...
и до показа окна(w.show()) не доходит и цикл сообщений(a.exec()) не запускается
перенесите ожидание конца потоков в деструктор окна например
1
Satansoft
8 / 8 / 1
Регистрация: 27.02.2012
Сообщений: 724
20.11.2014, 01:41  [ТС] #15
Цитата Сообщение от Cra3y Посмотреть сообщение
запустилось, но вы не в том месте потоки создаете
только заметил энто, а откуда лучше? Мне их по кнопке запускать надо.

Цитата Сообщение от Cra3y Посмотреть сообщение
а join ждет их завершения, учитывая что у вас циклы в потоках бесконечные...
бесконечность я устранил, но от этого корректный вывод окна не начался...

Цитата Сообщение от Cra3y Посмотреть сообщение
перенесите ожидание конца потоков в деструктор окна например
деструктор класса в другом файле, оно просто не увидит...
0
20.11.2014, 01:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.11.2014, 01:41
Привет! Вот еще темы с ответами:

Обращение к статической функции класса - C++
Всем привет! есть Number.h: using namespace std; #pragma once class Number { public: Number(void);

Как обратиться к члену класса - C++
Здравствуйте! Есть такой код: class ClassA { ... public: int t; }; class ClassB:public ClassA

Не могу получить доступ к члену класса - C++
Недавно начал изучать C++ и SDL и появилась проблема с кодом. Я могу создать поверхность(см. код) с помощь thisFunctionWoks, но не могу...

Перегрузка оператора доступа к члену класса - C++
Как осуществляется перегрузка оператора доступа к члену класса? Если можно, то приведите пример


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

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

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