Qt emit не вызывается, когда в QFuture

У меня есть кодовый файл со слотом, и я хочу, чтобы он что-то испускал, или когда какой-то случай происходит в самом потоке, или после фиксированного периода времени.

Первый, когда я вызываю emit из основного потока, работает нормально, и излучается сигнал с моими значениями. Вызов emit из QFutre в другом потоке вызывает функцию, в которой находится emit, но фактически никогда не выдает файл. Мой код файла cpp (упрощенный только для необходимых частей) выглядит следующим образом:

class MyClass : public QObject {
  void MyClass::myFunction(){
    connect(this, SIGNAL(mySignal()), otherClass, SLOT(mySlot()));
    //dosomething
    emit mySignal();
    QFuture<void> future = QtConcurrent::run([=]() {
      while (true)
      {
        usleep(500000);
        emit mySignal();
      }
    });
  }
}

Сигнал, кажется, работает только с нормальным emit, но не с emit в QFuture, хотя я уверен, что qFuture функция называется.

Я определил оба сигнала в MyClass.h также.

Кто-нибудь может сказать мне, что я делаю не так?

Я написал минимальный пример кода, но каким-то образом ошибка, кажется, не возникает в этом примере, хотя в общем случае она не сильно отличается от моего случая, который я не могу опубликовать.

main.cpp:

#include <QCoreApplication>

#include "headers/myClass.h"
#include <signal.h>
#include <iostream>
#include "headers/otherClass.h"

MyClass * myClass;
OtherClass * otherClass;

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    myClass = new MyClass();
    myClass->myFunction();

    return a.exec();
}

myClass.cpp:

#include "headers/myClass.h"
#include <QDebug>
#include <iostream>
#include <assert.h>
#include "unistd.h"
#include <QtConcurrent>

MyClass::MyClass(QObject *parent) : QObject(parent) {

}

MyClass::~MyClass() {
}

void MyClass::myFunction(){
  otherClass = QSharedPointer<OtherClass>(new OtherClass());
  connect(this, SIGNAL(mySignal()), otherClass.data(), SLOT(mySlot()));
  //dosomething
  qDebug() << "First Emit";
  testFunction();
  QFuture<void> future = QtConcurrent::run([=]() {
    while (true){
      usleep(500000);
      qDebug() << "QFuture Emit";
      testFunction();
    }
  });
}

void MyClass::testFunction(){
  emit mySignal();
}

otherClass.cpp:

#include <QDebug>
#include "./headers/otherClass.h"

OtherClass::OtherClass(){

}

OtherClass::~OtherClass(){

}

void OtherClass::mySlot(){
  qDebug() << "I'm beeing Called";
}

myClass.h:

#ifndef MYCLASS_H
#define MYCLASS_H

#include <QObject>
#include <QFuture>
#include "./otherClass.h"

class MyClass : public QObject {
    Q_OBJECT
public:
    MyClass(QObject *parent = 0);
    ~MyClass();

    void myFunction();

private:

    QFuture<void> future;
    QSharedPointer<OtherClass> otherClass;

    void testFunction();



signals:
    void mySignal();
};
#endif // MYCLASS_H

otherClass.h:

#ifndef OTHERCLASS_H
#define OTHERCLASS_H

#include <QDebug>
#include <QObject>

class OtherClass : public QObject{
    Q_OBJECT
    public:
        OtherClass();

        ~OtherClass();

    private:

    signals:

    public slots:
        void mySlot();
};


#endif // OTHERCLASS_H

1 ответ

Для меня это выглядит так, как будто mySignal является членом MyClass, Вы также объявили это в классе QFuture, экземпляр которого вы создали run?

Другие вопросы по тегам