⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨🎓。
如果觉得本文能帮到您,麻烦点个赞
👍呗!
近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三连支持一下呗。👍⭐️❤️
Qt5.9专栏
定期更新Qt的一些项目Demo
项目与比赛专栏
定期更新比赛的一些心得,面试项目常被问到的知识点。
QT5.9
专栏会定期更新有趣的Qt
知识
以工程为导向进行Qt5.9的学习,打捞基础。专栏中有Qt5.9学习笔记-仿Everything的的文件搜索的GUI工具,以及相关的基础知识。
最近在重新梳理一下Qt事件的基础知识,发现了一些有趣的知识点和开发的坑点,做一些笔记。
当涉及到Qt5.9事件时,事件系统是非常重要的一个主题。Qt5.9事件系统是一个强大的工具,它允许开发人员在Qt应用程序中响应和处理各种类型的事件。在本文中,我们将讨论Qt5.9事件系统的基础知识以及如何在应用程序中使用它来处理事件。
4. 多线程和事件处理
多线程和事件处理是Qt框架中非常重要的概念,能够帮助我们更好地实现复杂的功能,并提高应用程序的性能。本文将从理解多线程和事件处理、跨线程事件的发送和处理两个方面进行介绍。
4.1 理解多线程和事件处理
多线程和事件处理是两个独立但密切相关的概念。在单线程应用程序中,所有的代码都是顺序执行的,当应用程序接收到事件时,事件处理函数会在主线程中执行。而在多线程应用程序中,每个线程都有自己的执行上下文和事件队列,当应用程序接收到事件时,事件将被分发到相应的线程中进行处理。
在Qt框架中,我们可以使用QThread类来创建新的线程,并使用QObject类的moveToThread()函数来将对象移动到其他线程中。此外,Qt还提供了一套完整的多线程编程模型,包括信号和槽、事件处理、互斥锁等机制,能够帮助我们更好地实现多线程应用程序。
4.2 跨线程事件的发送和处理
在多线程应用程序中,当我们需要在一个线程中执行某个操作,并将操作结果返回给另一个线程时,就需要使用跨线程事件的发送和处理机制。在Qt框架中,我们可以使用QEvent和QCoreApplication类的postEvent()和sendEvent()函数来实现跨线程事件的发送和处理。
下面是一个简单的例子,演示了如何在一个新线程中执行一个任务,并将任务结果返回给主线程。
#include <QCoreApplication>
#include <QDebug>
#include <QThread>
#include <QTimer>
class Worker : public QObject {
Q_OBJECT
public:
Worker() {}
public slots:
void doWork() {
qDebug() << "Worker thread id: " << QThread::currentThreadId();
QThread::sleep(2);
qDebug() << "Work done!";
emit workFinished();
}
signals:
void workFinished();
};
class Controller : public QObject {
Q_OBJECT
public:
Controller() {
m_worker = new Worker();
m_workerThread = new QThread();
m_worker->moveToThread(m_workerThread);
connect(m_workerThread, &QThread::started, m_worker, &Worker::doWork);
connect(m_worker, &Worker::workFinished, this, &Controller::onWorkFinished);
m_workerThread->start();
}
~Controller() {
m_workerThread->quit();
m_workerThread->wait();
delete m_worker;
delete m_workerThread;
}
signals:
void startWork();
public slots:
void onWorkFinished() {
qDebug() << "Work finished!";
QCoreApplication::quit();
}
private:
Worker* m_worker;
QThread* m_workerThread;
};
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
Controller controller;
QTimer::singleShot(0, &controller, &Controller::startWork);
return a.exec();
}
#include "main.moc"
这段代码演示了在Qt中如何使用多线程来执行一个耗时操作(在这个例子中,是等待2秒),并在操作完成后关闭应用程序。
代码中定义了两个类:Worker和Controller
,Worker是一个执行耗时操作的工作线程,Controller
是应用程序的控制类,负责创建和管理工作线程,并在工作完成后关闭应用程序。
Worker
继承自QObject
,包含一个doWork()
函数,它在工作线程中执行。doWork()
函数会在工作线程中输出线程的ID,等待2秒钟,然后输出"Work done!",并发射workFinished()
信号表示工作完成。
Controller同样继承自QObject
,并包含一个指向Worker对象的指针和一个指向工作线程的指针。在Controller
的构造函数中,它创建了一个Worker对象和一个工作线程对象,并将Worker对象移到工作线程中。然后,Controller连接工作线程的started()信号到Worker对象的doWork()
槽函数,以便在工作线程启动时执行耗时操作。Controller
还连接了Worker
对象的workFinished()
信号到自己的onWorkFinished()
槽函数,在工作完成后关闭应用程序。
在main()函数中,创建了一个QCoreApplication
对象和一个Controller对象。然后,使用QTimer::singleShot()
函数延迟0毫秒,发出startWork()
信号以启动工作线程。最后,调用a.exec()
函数进入Qt
事件循环,等待应用程序关闭。
总体来说,这段代码演示了如何使用多线程来处理耗时操作,并在工作完成后关闭应用程序。同时,它也演示了如何在不同的线程中发送信号和槽,并在跨线程调用中避免潜在的问题。
最后,最后
如果觉得有用,麻烦三连👍⭐️❤️支持一下呀,希望这篇文章可以帮到你,你的点赞是我持续更新的动力