安吉网站建设,dede wap网站,wordpress中文免费模板下载地址,遵义怎样做网站1.概述
QRunnable与外界互通讯是有两种方法的
使用多继承。让我们的自定义线程类同时继承于QRunnable和QObject#xff0c;这样就可以使用信号和槽#xff0c;但是多线程使用比较麻烦#xff0c;特别是继承于自定义的类时#xff0c;容易出现接口混乱#xff0c;所以在项…1.概述
QRunnable与外界互通讯是有两种方法的
使用多继承。让我们的自定义线程类同时继承于QRunnable和QObject这样就可以使用信号和槽但是多线程使用比较麻烦特别是继承于自定义的类时容易出现接口混乱所以在项目中尽量少用多继承。
//使用多继承
class runnable : public QObject, public QRunnable
{Q_OBJECT
public:explicit runnable (QObject *parent nullptr){setAutoDelete(true);}void run() override{emit sig_finish();}
signals:void sig_finish();
};使用QMetaObject::invokeMethod
2.QMetaObject::invokeMethod的介绍
QMetaObject::invokeMethod的创建方法
QMetaObjectinvokeMethodQObject *obj //使用的类const char*member //调用函数名QtConnectionType type//调用类型QGenericReturnArgument ret//用来存储返回值的类型QGenericArgument val0 QGenericArgumentnullptrQGenericArgument val1 QGenericArgument QGenericArgument val2 QGenericArgument QGenericArgument val3 QGenericArgumentQGenericArgument val4 QGenericArgumentQGenericArgument val5 QGenericArgumentQGenericArgument val6 QGenericArgument QGenericArgument val7 QGenericArgument QGenericArgument val8 QGenericArgumentQGenericArgument val9 QGenericArgument//最多有10个参数*obj需要把使用类传进去 member函数的名称 type调用类型 Qt::DirectConnnect 立即调用该成员函数 Qt::QueuedConnection 一旦应用程序进入主事件循环就会发送QEvent 并调用成员。 Qt::BlockQueuedConnection当前线程将阻塞直到事件被传递。使用此连接类型在同一线程中的对象之间进行通信将导致死锁。 Qt::AutoConnection 如果 obj与调用方位于同一线程中则同步调用成员;否则它将异步调用该成员。 val0-val9最多可以有10个参数 传参的方式使用宏传参 Q_ARG(typeconst Typevalue) Q_RETURN_ARG(type, Typevalue) 3.QMetaObject::invokeMethod的使用
实现QRunnable与外界互传对象
假如我们在主界面中定一个函数Update_Result用于接收QRunnable::run()发送来的值并且返回结果给QRunnable::run()。
//继承QRunnable
class runnable : public QRunnable
{
public:explicit runnable(QObject *obj):obj(obj){setAutoDelete(true);}void run() override{int value 123;QString ret ;//接收主线程函数的返回值QMetaObject::invokeMethod(obj, Update_Result, Qt::BlockingQueuedConnection,//当前线程将阻塞直到事件被传递。使用此连接类型在同一线程中的对象之间进行通信将导致死锁。Q_RETURN_ARG( QString, ret),//返回Q_ARG(int,value));//传参qDebug()run返回值:ret;}QObject *obj;
};class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent nullptr);~MainWindow();//Q_INVOKABLE 用于更新界面内容的作用是用来修饰成员函数让被修饰的成员函数能够被元对象系统所唤起Q_INVOKABLE QString Update_Result(int value){QString ret QString(abc%1).arg(value);qDebug()Update_Result:ret;return ret;}private slots:void on_pushButton_clicked(){IAPrunnable *runnable new IAPrunnable(this);QThreadPool::globalInstance()-start(runnable);}}运行结果 Update_Result: “abc123” run返回值: “abc123”