C ++ QThread и соединение, вызывающее сбои - PullRequest
0 голосов
/ 01 июля 2018

Мой счетчик QThread дает сбой, давая странные результаты для того, каким должно быть число, поскольку поток правильно считает, но в функции SetLabel я получаю значение, отличное от того, что указано в QThread, и после 3 секунд происходит сбой, и метка, похоже, не обновляется. .

QThread* CountThread = new QThread;
Counter* Count = new Counter();
Count->moveToThread(CountThread);
connect(CountThread, SIGNAL(started()), Count, SLOT(Process()));
connect(Count, &Counter::SecondsUpdate, this, [=]{ SetLabel(Count->Seconds) ;});
connect(Count, SIGNAL(finished()), CountThread, SLOT(quit()));
CountThread->start();


void Counter::Process()
{
int secs = 0;
while (secs < 1000)
{
    qDebug() << "hello" << secs;
    secs += 1;
    Sleep(1000);
    emit SecondsUpdate();
}
emit finished();
}


void BaseWindow::SetLabel(int Seconds)
{
qDebug() << Seconds;
this->Test->setText(QString("Seconds: " + QString::number(Seconds)));
}

class Counter : public QObject
{
Q_OBJECT
public slots:
    void Process();

signals:
    void finished();
    void SecondsUpdate();

public:
    int getValue() { return Seconds;}
    int Seconds;

};

РЕДАКТИРОВАТЬ: Кажется, проблема заключается в изменении метки, как я прокомментировал это-> Text-> setText, и он не вылетел

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Показанный код имеет две основные проблемы.

  1. Counter::Seconds никогда не инициализируется / не обновляется.
  2. Переместив Count на новый QThread, вы продолжаете получать к нему доступ из основного потока.

Вы можете решить оба этих вопроса, избавившись от члена Seconds и просто передав локальный счетчик secs в качестве параметра для сигнала Counter::SecondsUpdate ...

class Counter: public QObject
{
  Q_OBJECT;
public slots:
  void Process();
signals:
  void finished();
  void SecondsUpdate(int seconds);
public:
};

void Counter::Process ()
{
  int secs = 0;
  while (secs < 1000)
  {
    qDebug() << "hello" << secs;
    secs += 1;

    /*
     * Sleep(1000) --> QThread::sleep(1)
     */
    QThread::sleep(1);

    /*
     * Pass secs as a parameter to the SecondsUpdate signal.
     */
    emit SecondsUpdate(secs);
  }
  emit finished();
}

Затем измените соответствующий connect вызов с ...

connect(Count, &Counter::SecondsUpdate, this, [=]{ SetLabel(Count->Seconds) ;});

к ...

connect(Count, &Counter::SecondsUpdate, this, &BaseWindow::SetLabel);
0 голосов
/ 01 июля 2018

Исправлено: проход через метку в виде указателя и редактирование в функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...