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

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

Восстановить пароль Регистрация
 
 
Satansoft
 Аватар для Satansoft
7 / 7 / 1
Регистрация: 27.02.2012
Сообщений: 698
19.11.2014, 23:34     Обращение потока к функции-члену класса #1
Есть Класс 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 не понимает такое обращение, тогда как понимает?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
19.11.2014, 23:51     Обращение потока к функции-члену класса #2
std::bind
C++
1
std::thread(std::bind(&(decltype(w)::Reader), w));
Satansoft
 Аватар для Satansoft
7 / 7 / 1
Регистрация: 27.02.2012
Сообщений: 698
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()
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
20.11.2014, 00:04     Обращение потока к функции-члену класса #4
хотя и без bind можно
C++
1
    std::thread(&decltype(w)::Reader,w);
http://ideone.com/aIoezC
Satansoft
 Аватар для Satansoft
7 / 7 / 1
Регистрация: 27.02.2012
Сообщений: 698
20.11.2014, 00:21  [ТС]     Обращение потока к функции-члену класса #5
Cra3y, даже ваш пример не запускается, интересно, почему...
ни VS2012 ни mingw этот вариант не нравится... порядка 16 ошибокъ
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
20.11.2014, 00:34     Обращение потока к функции-члену класса #6
Нужна поддержка C++11
для MinGW добавьте параметр -std=c++11
для VS2012 я не знаю
decltype я использовал, т.к. не было указано какого типа переменная w
попробуйте заменить decltype(w) на имя типа
Satansoft
 Аватар для Satansoft
7 / 7 / 1
Регистрация: 27.02.2012
Сообщений: 698
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;
}
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
20.11.2014, 00:46     Обращение потока к функции-члену класса #8
А ошибки выложить?)
Satansoft
 Аватар для Satansoft
7 / 7 / 1
Регистрация: 27.02.2012
Сообщений: 698
20.11.2014, 00:48  [ТС]     Обращение потока к функции-члену класса #9
Цитата Сообщение от Cra3y Посмотреть сообщение
А ошибки выложить?)
На 2 монитора не влазят, а с bind только одна

invalid use of non-static member function 'int MainWindow::Reader()
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
20.11.2014, 00:53     Обращение потока к функции-члену класса #10
C++
1
std::thread(std::bind(&decltype(w)::Reader, &w));
выложите весь проект архивом, только почистите от бинарников(Сборка->Очистить решение)
Satansoft
 Аватар для Satansoft
7 / 7 / 1
Регистрация: 27.02.2012
Сообщений: 698
20.11.2014, 01:00  [ТС]     Обращение потока к функции-члену класса #11
Cra3y, это Qt проект с логикой полностью на С++11, с Qt только интерфейс.
Вложения
Тип файла: 7z Parallel.7z (333.2 Кб, 3 просмотров)
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 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
Satansoft
 Аватар для Satansoft
7 / 7 / 1
Регистрация: 27.02.2012
Сообщений: 698
20.11.2014, 01:28  [ТС]     Обращение потока к функции-члену класса #13
Cra3y, но разве запустилось?

Добавлено через 4 минуты
И невозможность вызвать main()...
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
20.11.2014, 01:31     Обращение потока к функции-члену класса #14
запустилось, но вы не в том месте потоки создаете
у вас они друг друга лочат
а join ждет их завершения, учитывая что у вас циклы в потоках бесконечные...
и до показа окна(w.show()) не доходит и цикл сообщений(a.exec()) не запускается
перенесите ожидание конца потоков в деструктор окна например
Satansoft
 Аватар для Satansoft
7 / 7 / 1
Регистрация: 27.02.2012
Сообщений: 698
20.11.2014, 01:41  [ТС]     Обращение потока к функции-члену класса #15
Цитата Сообщение от Cra3y Посмотреть сообщение
запустилось, но вы не в том месте потоки создаете
только заметил энто, а откуда лучше? Мне их по кнопке запускать надо.

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

Цитата Сообщение от Cra3y Посмотреть сообщение
перенесите ожидание конца потоков в деструктор окна например
деструктор класса в другом файле, оно просто не увидит...
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
20.11.2014, 01:56     Обращение потока к функции-члену класса #16
Так перенесите массивы потоков в класс...
Satansoft
 Аватар для Satansoft
7 / 7 / 1
Регистрация: 27.02.2012
Сообщений: 698
20.11.2014, 02:08  [ТС]     Обращение потока к функции-члену класса #17
Цитата Сообщение от Cra3y Посмотреть сообщение
Так перенесите массивы потоков в класс...
засунуть их в функцию внутри класса и из неё их вызывать?

Добавлено через 6 минут
Напрямую создавать треды снова не выходит, хоть они и в одном классе

C++
1
2
3
4
5
 for(i=0;i<N;i++)
        {
           WR[i] = std::thread(Writer);
 
        }
no matching function for call to 'std::thread::thread(<unresolved overloaded function type>)
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
20.11.2014, 06:09     Обращение потока к функции-члену класса #18
C++
1
std::thread(&decltype(*this)::Reader, this);
Добавлено через 3 минуты
Просто запомните, что метод класса это функция со скрытым параметром - объектом к которому применяется данный метод
Satansoft
 Аватар для Satansoft
7 / 7 / 1
Регистрация: 27.02.2012
Сообщений: 698
20.11.2014, 18:06  [ТС]     Обращение потока к функции-члену класса #19
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
int call_f()
    {
    std::thread WR[N];
    std::thread RE[M];
    int i;
 
        for(i=0;i<N;i++)
        {
           WR[i] = std::thread(&decltype(*this)::Writer, this);
 
        }
        for(i=0;i<M;i++)
        {
           RE[i] = std::thread(&decltype(*this)::Reader, this);
 
        }
        for(i=0;i<N;i++)
        {
            WR[i].join();
        }
        for(i=0;i<M;i++)
        {
            RE[i].join();
        }
        return 0;
    }
decltype evaluates to 'MainWindow&', which is not a class or enumeration type
Засунув в один класс, напрямую не обратиться к методу, уже свинство... использовал ваш метод доступа, так через указатель this даже не считает его классом...где ошибка-то?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.11.2014, 18:08     Обращение потока к функции-члену класса
Еще ссылки по теме:

Не могу получить доступ к члену класса C++
C++ Не хватает прав доступа к закрытому члену класса из дружественной функции
C++ Как обратиться к члену класса

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

Или воспользуйтесь поиском по форуму:
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
20.11.2014, 18:08     Обращение потока к функции-члену класса #20
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
std::thread(&MainWindow::Reader, this)
Yandex
Объявления
20.11.2014, 18:08     Обращение потока к функции-члену класса
Ответ Создать тему
Опции темы

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