QMetaObject::invokeMethod跨线程调用方法
创建工作类#includeQObjectclassWorker:publicQObject{Q_OBJECTpublic:explicitWorker(QObject*parentnullptr);Q_INVOKABLEbooloutputThread(constQStringtext){qDebug()textthread QThread::currentThread();returntrue;}publicslots:voidslotOutputThread(constQStringtext){qDebug()textthread QThread::currentThread();}};主线程中调用#includeQThread#includeworker.hvoidMainWindow::on_pushButton_clicked(){QThread*thdnewQThread();Worker*wkrnewWorker();wkr-moveToThread(thd);connect(thd,QThread::finished,this,[](){wkr-deleteLater();});connect(thd,QThread::finished,this,[](){thd-deleteLater();});connect(this,MainWindow::sendOutputThread,wkr,Worker::slotOutputThread);thd-start();QThread::sleep(1);//等待线程启动emitsendOutputThread(send);boolret_queuedfalse;boolret_directfalse;boolret_blockfalse;QMetaObject::invokeMethod(wkr,outputThread,Qt::QueuedConnection,Q_RETURN_ARG(bool,ret_queued),Q_ARG(constQString,queued));QMetaObject::invokeMethod(wkr,outputThread,Qt::BlockingQueuedConnection,Q_RETURN_ARG(bool,ret_block),Q_ARG(constQString,block));QMetaObject::invokeMethod(wkr,outputThread,Qt::DirectConnection,Q_RETURN_ARG(bool,ret_direct),Q_ARG(constQString,direct));qDebug()ret_queued ret_queued,ret_block ret_block;}打印结果main thdQThread(0x18ad5354980)QMetaMethod::invoke:Unable to invoke methods withreturnvalues in queued connectionssendthreadQThread(0x18ad7b47a30)blockthreadQThread(0x18ad7b47a30)directthreadQThread(0x18ad5354980)ret_queuedfalse,ret_directtrue,ret_blocktrue提示QMetaMethod::invoke: Unable to invoke methods with return values in queued connections这是因为Qt::QueuedConnection用于异步的、跨线程的方法调用但有一个重要限制它不能直接用于调用带有返回值的方法把返回值去掉再把阻塞形式Qt::BlockingQueuedConnection注释运行结果如下main thdQThread(0x1e96bfd4690)directthreadQThread(0x1e96bfd4690)sendthreadQThread(0x1e96e8dd6d0)ret_queuedfalse,ret_directtrue,ret_blockfalsequeuedthreadQThread(0x1e96e8dd6d0)分析一下①Qt::QueuedConnection用于异步的、跨线程的方法调用不能直接用于调用带有返回值的方法②Qt::DirectConnection立即在当前线程执行可以获取返回值③Qt::BlockingQueuedConnection跨线程同步调用可以获取返回值。但使用该类型一定要注意确保两个线程不会相互等待而造成死锁例如在工作线程中阻塞等待主线程④Qt::AutoConnection 这是未测试的方法该方法可以根据对象线程关系自动选择Direct或Queued⑤Q_INVOKABLE修饰函数会将函数暴漏给元对象系统允许外部安全调调用甚至是突破权限private、protected函数均可实现⑥信号与槽的方式仍是最安全最值得推荐的方式
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2420344.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!