网站首页 > 技术文章 正文
在线程间进行回调可以通过信号和槽机制来实现。具体的实现方式如下:
- 在回调函数所在的类中声明自定义信号(在头文件中):
// MyClass.h
class MyClass : public QObject {
Q_OBJECT
public:
void longRunningFunction();
signals:
void longRunningFunctionComplete(QString result);
};
这里,我们在 MyClass 类中声明了一个自定义信号 longRunningFunctionComplete,该信号将在回调完成时发射,并将回调函数的返回值作为参数传递给槽函数。
- 实现 longRunningFunction() 函数,该函数启动一个新线程并在该线程中执行长时间运行的任务。当任务完成并需要进行回调时,任务中发射 MyObject 的信号(在 .cpp 文件中):
// MyClass.cpp
#include <QThread>
#include "MyClass.h"
class Worker : public QObject {
Q_OBJECT
public:
QString result;
public slots:
void doWork() {
// 假设这里执行了长时间运行的任务并获得了结果
result = "myResult";
QMetaObject::invokeMethod(parent(), "longRunningFunctionComplete", Qt::QueuedConnection, Q_ARG(QString, result));
}
};
void MyClass::longRunningFunction()
{
auto worker = new Worker();
worker->moveToThread(QThread::newThread(this));
connect(worker, &Worker::finished, worker, &QObject::deleteLater);
connect(this, &MyClass::startLongRunningFunction, worker, &Worker::doWork);
connect(worker, &Worker::resultReady, this, &MyClass::handleResults);
QThread::start();
emit startLongRunningFunction();
}
QT开发交流+赀料君羊:661714027
注意,这里我们需要在 MyObject 类的实现中创建一个内部类 Worker,该类实现了线程中的回调函数。然后,我们将 worker 对象移到新的线程中,并使用 connect() 函数将 worker 对象的 finished() 信号连接到 deleteLater() 槽上,以确保 worker 对象被正确地销毁。接下来,我们将 MyClass 对象的 startLongRunningFunction() 信号连接到 worker 对象的 doWork() 槽上,并将 Worker 对象的 resultReady() 信号
- 上一篇: Qt5线程关闭 qt线程操作ui
- 下一篇: Qt分别实现Windows和Linux下开机自启动的方法
猜你喜欢
- 2024-10-24 QT(17)- QNetworkAccessManager qnetworkinterface.allinterfaces
- 2024-10-24 Qt多线程的三种方法QThread qt多线程直接处理数据
- 2024-10-24 从零开始学Qt(86):TCP服务器端程序设计
- 2024-10-24 Qt Core学习日记——第九天QObjectData
- 2024-10-24 Qt智能指针--QSharedPointer qt智能指针.get和.data函数后计数会加吗
- 2024-10-24 QT(11)- QThread qt ui thread work thread
- 2024-10-24 Qt QVariant的用法 qt基本语法
- 2024-10-24 Qt5中QOverload的用法 qt5coredll
- 2024-10-24 Qt多线程编程之QThread qt中的多线程
- 2024-10-24 Qt QModbusReply类 qty是什么单位的缩写
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)