How can I emit signal from QRunnable or call callback?
Solved
General and Desktop
-
Hello. I need your help with such a problem. This is an example of a basic code:
class Runnable : public QRunnable { explicit Runnable(QImage* qimg, uint index):m_qimage(qimg),m_index(index) { } void run() { if(m_qimage->scale(1280,720)->save(QString("%1.jpg").arg(index))) { // i need to emit a signal in this place } } private: QImage* m_qimage; uint m_index; } ; class Controller : public QObject { explicit Controller(QObject* parent = 0) { m_pool = new QThreadPool(this); } public slots: void slotWithoutName(QImage* qimg,uint index) { Runnable * m_worker = new Runnable(qimg,index); m_pool->start(m_worker); } void slotAnsverFromRunnableClass(uint index) { qDebug()<<"Okey , I've done my work!!!\n"; } private: QThreadPool* m_pool; };
.....and somewhere in the program :
connect(this, SIGNAL(frame(QImage* qimg,uint index)),m_controller,SLOT(slotWithoutName(QImage* qimg,uint index)));
Please, tell me how is right to call the implementation of a slot
void slotAnsverFromRunnableClass(uint index)
from class Runnable I tried
QMetaObject::invokeMethod(m_p_controller,"slotAnsverFromRunnableClass",Qt::AutoConnection,Q_ARG(uint,index));
, but it gave no results and no output to the console QtCreator about the mistake too...
Tried this one:class Runnable : public QObject ,public QRunnable { Q_OBJECT explicit Runnable(QImage* qimg, uint index):m_qimage(qimg),m_index(index) { } void run() { if(m_qimage->scale(1280,720)->save(QString("%1.jpg").arg(index))) { // i need to emit signal in this place emit mySignal(index); } } signals: void mySignal(uint index); //... other code //..... };
but this method gave no results too. As I understand there is any rule of association between streams using signals or calling callback functions which I don't know... Please, help me to solve this problem. Thanks
-
Hi! There is no "special rule"; everything works as expected:
work.h
#ifndef WORK_H #define WORK_H #include <QRunnable> #include <QDebug> #include <QObject> class Work : public QObject, public QRunnable { Q_OBJECT public: void run(); signals: void sayHi(); }; #endif // WORK_H
work.cpp
#include "work.h" #include <QDebug> #include <QThread> void Work::run() { qDebug() << "Hello from thread " << QThread::currentThread(); emit sayHi(); }
main.cpp
#include "mainwindow.h" #include <QApplication> #include <QThreadPool> #include <QDebug> #include <QObject> #include "work.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); Work work; work.setAutoDelete(false); QThreadPool *threadPool = QThreadPool::globalInstance(); threadPool->start(&work); QObject::connect(&work, &Work::sayHi, &app, &QApplication::quit); return app.exec(); }
-
So just for anyone who still gets errors (like me):
The order of inheritance is very important. Always include the Object first!