当前位置: 首页 > news >正文

网站单页制作营销网站开发规划

网站单页制作,营销网站开发规划,网站建设行情,网站平台建立1. 前言 QThread是Qt中的线程类#xff0c;用于实现多线程运行。 QThread有两种工作模式#xff0c;即 消息循环模式无消息循环模式 两种模式分别适用于不同的场景。下面我们将从多个方面#xff0c;讲解QThread两种工作模式的区别。 2. 消息循环模式 2.1 实现原理 Q…1. 前言 QThread是Qt中的线程类用于实现多线程运行。 QThread有两种工作模式即 消息循环模式无消息循环模式 两种模式分别适用于不同的场景。下面我们将从多个方面讲解QThread两种工作模式的区别。 2. 消息循环模式 2.1 实现原理 QThread::run中的代码是在子线程中运行的。 QThread::run是虚函数从它的默认实现的中可以看到在QThread::run中启动了一个QEventLoop即事件循环。部分源码如下所示文件路径Qt5.9.9\5.9.9\Src\qtbase\src\corelib\thread\qthread.cpp 其中 有了事件循环子线程就可以像UI线程即主线程一样进行消息处理。 2.2 使用方法 设worker是QObject子类的一个对象具有信号和槽。如何让worker的槽函数运行于子线程中可以使用 QObject::moveToThread()函数来将worker对象关联到某个子线程中。典型的写法如下 QThread *thread new QThread(this); // 线程对象 Worker *worker new Worker(this); // 工人对象 worker-moveToThread(thread); // worker-thread 关联 thread-start(); // 启动线程此后通过Qt::AutoConnection/Qt::QueuedConnection/Qt::BlockQueuedConnection方式连接到worker的信号一旦被触发Qt内部就会向worker所在子线程插入一条消息等到消息循环处理到这条消息时worker的槽函数会在子线程中被执行。 同理若worker的某个信号通过Qt::AutoConnection/Qt::QueuedConnection/Qt::BlockQueuedConnection方式连接到主线程的一个对象的槽函数上当此信号触发时Qt也会向主线程的消息队列中插入一条消息。当主线程的消息循环处理到这条消息时主线程对象的槽函数会在主线程中被执行。 简而言之消息循环模式下线程之间进行信号槽通信通常都是由消息机制实现的并且槽函数是在对象的关联线程中执行的。 2.3 线程退出方法 在消息循环模式下通过调用QThread::quit() 或 QThread::exit() 方法可以在对应线程的消息队列中插入一条退出消息等到此条退出消息被处理时QEventLoop::exec()返回即消息循环退出。随后QThread::run()函数也会退出线程停止线程资源被释放。相关Qt源码如下 通过停止消息循环来停止线程是一个异步操作。因为消息循环可能忙于执行某个函数而无法处理退出消息这就导致线程的退出时间不确定。所以QThread::quit()通常和QThread::wait() 在主线程中搭配调用以实现主线程等待子线程退出。等待时长可以由用户根据实际情况来设置。如果线程退出时间过长则需要对耗时长的函数进行优化以实现快速退出的效果。当然如果消息循环空闲则退出消息会很快得到处理消息循环和线程会很快退出。 3. 无消息循环模式 3.1 实现原理 用户继承 QThread并重载 QThread::run()即可使默认的消息循环失效用户将需要在子线程执行的代码全部写在重载的run()函数内。在这种模式下只有重载的 run() 函数是在子线程中运行的。弄清楚这一点才能准确判断一段代码的执行线程。 3.2 使用方法 示例代码如下 class MyThread : public QThread { protected:virtual void run(){// process code here} }创建和启动线程 MyThread *thread new MyThread(this);thread-start();3.3 线程退出方法 因为没有消息循环所以通过抛退出消息来使线程退出的QThread::quit()函数会失效。有两种退出/停止线程的方法强制退出和正常退出。 3.3.1 强制退出 使用 QThread::terminate() 函数可以让操作系统强制停止线程的执行。 调用 QThread::terminate() 后线程不一定会立即退出退出时间取决于操作系统。主线程可以调用 QThread::wait() 来等待线程退出。 正如 Qt 文档中所说强制退出线程会导致资源来不及释放和清理这会导致软件不稳定非必要不使用。 3.3.2 正常退出 如果想要让线程正常退出那么就需要在 QThread::run() 函数中插桩检测停止标记。一旦停止标记为真则停止当前的工作做好现场清理和资源释放然后令 QThread::run() 函数返回即可。同时对外提供停止接口用于设置停止标记。 示例代码如下 class MyThread : public QThread { protected:virtual void run(){do{// 插桩检测停止标记if (m_stop_flag)break;// process code here// 插桩检测停止标记if (m_stop_flag)break;// process code here// 插桩检测停止标记if (m_stop_flag)break;// process code here} while (0);// 清理现场和资源clean();}// 对外提供停止接口void stop(){m_stop_flag true;}private:bool m_stop_flag false; }调用stop()接口以后线程不会立即退出需要调用 QThread::wait() 来等待线程退出。通过控制插桩位置和频率可以控制线程退出的速度。停止代码如下 thread-stop(); // 停止线程 thread-wait(2000); // 等待线程退出不超过2s4. 结语 在项目中我们需要根据实际需求选择正确的线程运行模式合理地实现软件功能同时提高导致软件的稳定性和可靠性。 以上是Qt线程的基本使用方法可以满足基本的使用需求。但用起来还是稍显麻烦。在此基础上Qt Concurrent模块提供了启动线程的其他简便方式及高级用法但万变不离其宗打牢基础以后学习高级用法会非常简单。对于Qt Concurrent模块我们将在后面的文章进行讲解。
http://www.hkea.cn/news/14479818/

相关文章:

  • 单网页网站如何做百度词条
  • 孵化基地网站怎么建设高校思政专题网站建设
  • 如何构建一个网站没有后台的网站怎么做排名
  • 自适应网站制作公司加速器免费加速
  • 怎么设置网站关键词微信二维码在线制作
  • 网站制作公司排名前十起名字大全免费
  • 无锡做网站公司网店设计是什么
  • 网站广告联盟怎么做的图书馆网站开发策划书
  • 长沙网站建设哪个公司好公司做网络宣传哪个网站比较好
  • 评估网站建设方案镇安县住房和城乡建设部网站
  • 汕头建设局网站手机网站建设进度
  • led网站模板宁波租房网
  • 网站建设规划书费用预算wordpress 顶部工具条
  • 定西地网站建设产品宣传短视频
  • 哈尔滨网站建设贴吧广州网站建设 致茂
  • 中国中小企业网站建设情况批量查询网站是否正常
  • wordpress个人展示网站新的网站建设技术
  • 网站设置的建设过程和准备阶段想学编程去哪里找培训班
  • 聊城做网站费用价位3d做号网站
  • 做博客网站最好用什么系统推广联盟平台
  • 玄武网站建设帝国cms网站地图xml
  • 企业网站psd模板做网站 郑州公司
  • 金泉网做网站东莞网络营销外包公司
  • 企业网站建设的重要性及意义产品推销
  • 百度是门户网站吗泗塘新村街道网站建设
  • 昆明做网站推上海做公益活动有哪些好的网站
  • 网站建设网站服务流程企业管理软件销售
  • 网站首页大图轮播做个网站得花多少钱
  • 服务网站设计案例万网域名注册商
  • 济源市网站建设建网站为什么要租空间