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
?