Thread, проблема с параллельным трэдом (Qt)

Мой app состоит из симулянта производителя музыки. Давно я написал код, чтобы осуществлять в мой app Qt часы (которые функционировали хорошо), которые появлялись бы в QPlainTextEdit. Я хочу использовать эти часы для того, чтобы он уменьшил время, которое остается для того, чтобы песня закончилась, когда будет нажата кнопка Play. Сейчас, дав play, он уменьшает мне 1,2 или 3 секунды и далее программа ломается, и консоль printea следующее:

QObject::connect: Cannot queue arguments of type 'QTextBlock'
(Make sure 'QTextBlock' is registered using qRegisterMetaType().)
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QTextDocument(0x20d212c0), parent's thread is QThread(0x1e6f90), current thread is myThreadPlay(0x287f00a0)
QObject::connect: Cannot queue arguments of type 'QTextCursor'
(Make sure 'QTextCursor' is registered using qRegisterMetaType().)
11:24:01: The program has unexpectedly finished.

Восток - .cpp параллельного трэда:

#include "mythreadplay.h"
#include "vprincipal.h"
#include <QDebug>
int Segundos;
int Minutos;
QString Reloj;
myThreadPlay::myThreadPlay(int seg, int min)
{
    Segundos=seg;
    Minutos=min;
}
myThreadPlay::myThreadPlay(QObject *parent): QThread(parent)
{
}
void myThreadPlay::run()
{
    while (Segundos != 0 || Minutos != 0)
    {
        if(Segundos == 0 && Minutos > 0)
        {
            Segundos = 59;
            Minutos --;
            Reloj ="00:"+ QString::number(Minutos) + ":" + QString::number(Segundos);
        }
        else
        {
            Segundos--;
            Reloj ="00:"+ QString::number(Minutos) + ":" + QString::number(Segundos);
        }
        emit cambioReloj(Reloj, Minutos, Segundos);
        msleep(1000);
    }
}

и этот Ваш.h

#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>
class myThreadPlay : public QThread
{
    Q_OBJECT
private:
    int Minutos;
    int Segundos;
public:
    explicit myThreadPlay(QObject *parent = nullptr);
    myThreadPlay(int Segundo, int Minuto);
signals:
    void cambioReloj(QString, int, int);
protected:
    void run();
};
#endif // MYTHREAD_H

Я благодарен за помощь,

Приветствие!

0
задан 23.12.2019, 12:38
1 ответ

cГіdigo, где я соединяю мою программу с трэдом, это следующий:

void vPrincipal::eventBtnPlay()
{
    QString sS = ListaSegs.takeAt(idActual);
    int s = sS.toInt();
    QString sM = ListaMins.takeAt(idActual);
    int m = sM.toInt();


    mTPlay = new myThreadPlay(s, m);
    mTPlay->start(QThread::HighPriority);
    connect(mTPlay, &myThreadPlay::cambioReloj,[&](QString qs, int a, int b)
    {
        if (a!=0 || b!=0)
        {
            ui->txtReloj->setPlainText(qs);
        }
        else idActual++;
    }
    );
}
0
ответ дан 23.12.2019, 22:06
  • 1
    Это не ответ а edició n вопроса. Пожалуйста, издай вопрос и удали этот ответ..., так как это не такая вещь – eferion 23.12.2019, 14:17
  • 2
    Используй ссылку издавать в твоем вопросе для añ adir informació n добавочный. botó n Печатать ответ нужно использовать только для полных ответов в вопрос. - С revisió n – Roger Torné 23.12.2019, 16:49