Вызов метода одного потока из другого

136
25 февраля 2019, 08:50

У меня есть функция которая вызывается отдельным потоком и поток отделяется:

 std::thread thr(IncrementTime:: incTime);
 thr.detach();

Эта функция представляет собой бесконечный цикл.

Задача стоит в том, чтобы изменять label формы(Widget) после каждого прохождения цикла.

Части кода:

IncrementTime.h

#ifndef INCREMENTTIME_H
#define INCREMENTTIME_H
class IncrementTime
{
public:
    static void incTime();
};
#endif // INCREMENTTIME_H

IncrementTime.cpp

#include "incrementtime.h"
#include "global_objects.h"
#include <windows.h>
#include "widget.h"
void IncrementTime::incTime(){
    Widget widg;
    while(1){
        sec++;
        if(sec == 60){
            sec = 0;
        }
          //тут выпадает ошибка
        widg.smena(); //Cannot create children for a parent that is in a 
        Sleep(1000); //different thread
    }
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include "global_objects.h"
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
}
Widget::~Widget()
{
    delete ui;
}
void Widget::smena(){
        ui->label_3->setText(QString::number(sec));
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
    Q_OBJECT
public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();
public slots:
    void smena();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
Answer 1

Работать с GUI можно только из основного потока программы. В вашем случае поток должен не сам изменять значения на виджете, а отправлять ему сигнал для изменения данных, чтобы все изменения происходили в главном потоке. Отдельный поток нужен, если вычисления требуют много времени и интерфейс постоянно зависает, но если в вашем incTime() нет ничего другого, то логичнее использовать таймер и не заморачиваться с потоками.

READ ALSO
Проверка соседних ячеек массива в игре крестики-нолики

Проверка соседних ячеек массива в игре крестики-нолики

Задание: необходимо реализовать ИИ при игре в крестики-нолики на джавеСамый первый шаг рандомный выбор ячейки и проверка соседних ячеек...

132
Как форматировать массив

Как форматировать массив

Выводит эти значения, но RUB,PLN,JPY,DKK и так дальше, не форматированы

134
зачем проверять if(fos!=null)

зачем проверять if(fos!=null)

Учу андроид разработкуИ уведел такую штуку:

191
Считывание файла в массив Java [закрыт]

Считывание файла в массив Java [закрыт]

Есть файл, содержавший число: testtxt

124