Создание потока в методе класса

178
29 августа 2018, 13:00

Не получается создать поток thread (c++11) внутри метода класса - каждый раз ошибка компиляции:

C:\Qt\Qt5.8.0_mingw\Tools\mingw530_32\i686-w64-mingw32\include\c++\functional:1505: ошибка: no type named 'type' in 'class std::result_of(Values_Refresher_Class*, QTableWidget*, Values_Refresher_Class*)>' typedef typename result_of<_Callable(_Args...)>::type result_type;

C:\Qt\Qt5.8.0_mingw\Tools\mingw530_32\i686-w64-mingw32\include\c++\functional:1526: ошибка: no type named 'type' in 'class std::result_of(Values_Refresher_Class*, QTableWidget*, Values_Refresher_Class*)>' _M_invoke(_Index_tuple<_Indices...>)

Вот код:

#include <thread>
// Функция запуска потока
void Values_Refresher_Class::Start(QTableWidget *Table)
{
     // Установить флаг работы потока
     To_Work = true;
     // Задать потоку функцию
     thread Refresher_Thread = thread(&Values_Refresher_Class::Refresher_Handler, Table, this);
}
// Функция обработчика потока
void Values_Refresher_Class::Refresher_Handler(QTableWidget *Table)
{
    // Пока установлен флаг работы потока
    while(To_Work)
    {
        // Обновить список переменных
        Refresh_Values(Table);
        // Остановить поток на Refresh_Delay
        QThread::sleep(Refresher_Delay);
    }
}

Облазил кучу форумов и никак не могу понять в чем дело- если поток создавать в main, то все работает, но если перенести поток в класс, то сразу же все перестает работать. В чем может быть дело?

Работаю в QT Creator под MinGW. Использую не Qt-шные потоки, а стандартные, т.к. хочу научиться с ними работать

Answer 1

this должен идти первым из аргументов:

::std::thread Refresher_Thread{&Values_Refresher_Class::Refresher_Handler, this, Table};
Answer 2

Метод Refresher_Handler не статический, поэтому у него есть еще один скрытый параметр: this для которого будет вызван метод Refresher_Handler.

Либо объявите его статическим, либо добавьте дополнительный аргумент в конструктор thrread :

thread(&Values_Refresher_Class::Refresher_Handler, this, Table, this);
READ ALSO
Segmentation fault в реализации класса Any

Segmentation fault в реализации класса Any

В процессе изучения C++ решал вот эту задачуЕсли кратко, то экземпляры нешаблонного класса Any (который и нужно реализовать) должны иметь способность...

189
Ubuntu, gcc, сборка so, не работают try..catch

Ubuntu, gcc, сборка so, не работают try..catch

Собираю библиотеку Libso (Ubuntu, gcc 5

158
Арканоид на c++

Арканоид на c++

Задали написать арканоидВозникла проблема с моментом физики поведения мяча, мяч и дощечка ( от которой он отскакивает ) представляют собой...

561
Поиск файла в папке ресурсов

Поиск файла в папке ресурсов

Есть проект с архитектурой:

160