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

如何下载别人网站模板如何做好网站推广优化

如何下载别人网站模板,如何做好网站推广优化,如何把自己的产品放到网上卖,南京百度关键字优化价格一、概述 1、在进行桌面应用程序开发的时候,假设应用程序在某些情况下需要处理比较复制的逻辑,如果只有一个线程去处理,就会导致窗口卡顿,无法处理用户的相关操作。这种情况下就需要使用多线程,其中一个线程处理窗口事…

一、概述

1、在进行桌面应用程序开发的时候,假设应用程序在某些情况下需要处理比较复制的逻辑,如果只有一个线程去处理,就会导致窗口卡顿,无法处理用户的相关操作。这种情况下就需要使用多线程,其中一个线程处理窗口事件,其它线程进行逻辑运算,多个线程各司其职,不仅可以提高用户体验还可以提升程序的执行效率。

2、当前的主线程不能让它做非常复制的逻辑操作,如果你让它做了非常复杂的逻辑操作后,咱们再操作这个窗口的时候就会出现界面的卡顿,那么这些复杂的操作应该交给子线程去做。

3、默认的线程在Qt中称之为窗口线程,也叫主线程,负责窗口事件处理或者窗口控件数据的更新。

4、子线程复制后台的业务逻辑处理,子线程中不能对窗口对象做任何操作,这些事情需要交给窗口线程处理。

5、主线程和子线程之间如果要进行数据的传递,需要使用Qt中的信号与槽机制

二、多线程的使用方式一

1、需要创建一个线程的子类,让其继承QT中的线程类QThread

class MyThread : public QThread
{...............
}

2、重写父类的run方法,在该函数内部编写子线程要处理的具体的业务流程

class MyThread : public QThread
{.........
protected:void run(){........}
}

3、在主线程中创建子线程对象,new一个就可以了

MyThread *subThread = new MyThread;

 4、启动子线程,调用start()方法

subThread->start();

5、示例 MyThread.h

#ifndef MYTHREAD_H
#define MYTHREAD_H#include <QObject>
#include <QThread>class MyThread : public QThread
{Q_OBJECT
public:MyThread();void print();protected:void run() override;signals:
};#endif // MYTHREAD_H

6、 示例 MyThread.cpp

#include "mythread.h"
#include <QDebug>MyThread::MyThread()
{
}void MyThread::print()
{qDebug() << "子线程成员函数的线程ID:" << QThread::currentThreadId();
}void MyThread::run()
{qDebug() << "子线程的线程ID:" << QThread::currentThreadId();
}

7、main函数

int main(int argc, char *argv[])
{QApplication a(argc, argv);MyThread w;w.start();qDebug() << "主线程ID:" << QThread::currentThreadId();w.print();return a.exec();
}

8、结果展示

 9、结果分析:

(1)主线程和子线程的顺序不确定,偶尔主线程在前,偶尔子线程在前

(2)子线程类的成员函数包括槽函数是运行在主线程当中的,只有run()函数运行在子线程中

(3)如果run()函数中调用子线程的成员函数,那么该成员函数运行在子线程中

二、多线程的使用方式二

 1、创建一个新的类,让这个类从QObject派生

class MyWork : public QObject
{.........
}

2、在这个类中添加一个公共的成员函数,函数体就是我们要子线程中要执行的业务逻辑

class MyWork : public QObject
{
public:......//函数名自己指定,叫什么都可以void working();
}

3、在主线程中创建一个QThread对象,这就是子线程的对象

QThread *sub = new QThread;

4、在主线程中创建工作的类对象(不要给创建的对象指定父对象)

MyWork *work = new MyWork(this);  //error
MyWork *work = new MyWork;        //ok

5、将MyWork对象移动到创建的子线程对象中,需要调用QObject类提供的moveToThread()方法

work->moveToThread(sub);

6、启动子线程,调用start(),这时候线程启动了,但是移动到线程中的对象并没有工作

7、调用MyWork类对象的工作函数,让这个函数开始执行,这时候是在移动到的那个子线程中运行的

8、示例 MyWork.h

#ifndef MYWORK_H
#define MYWORK_H#include <QObject>class MyWork : public QObject
{Q_OBJECT
public:explicit MyWork(QObject *parent = nullptr);void print();public slots:void doWork();signals:
};#endif // MYWORK_H

9、示例 MyWork.cpp

#include "mywork.h"
#include <QDebug>
#include <QThread>MyWork::MyWork(QObject *parent): QObject{parent}
{
}void MyWork::print()
{qDebug() << "成员函数ThreadID:" << QThread::currentThreadId();
}void MyWork::doWork()
{qDebug() << "doWork ThreadId:" << QThread::currentThreadId();
}

10、示例 main

int main(int argc, char *argv[])
{QApplication a(argc, argv);QThread *thread = new QThread();MyWork *worker = new MyWork;worker->moveToThread(thread);QObject::connect(thread, &QThread::started, worker, &MyWork::doWork);QObject::connect(thread, &QThread::started, worker, &MyWork::print);qDebug() << "主线程ID:" << QThread::currentThreadId();//启动线程thread->start();//调用成员函数worker->print();return a.exec();
}

 11、运行结果

22:38:21: Starting D:\QT\practice\mouseTrack\bin\debug\untitled.exe...
主线程ID: 0x56f0
成员函数ThreadID: 0x56f0
doWork ThreadId: 0x49d4
成员函数ThreadID: 0x49d4

 12、结果分析

(1)通过信号与槽触发的成员函数、槽函数,执行都在新线程里面,通过对象调用执行,则在旧线程里面

三、QThread常用函数

1、start():启动线程,使线程进入运行状态

2、quit():终止线程的事件循环

3、terminate():强制终止线程的执行,不推荐使用,可能导致资源泄露和未定义的行为

4、wait():阻塞当前线程,直到线程执行完成或超时

5、finished():在线程执行完成时发出信号

6、isRunning():判断线程是否正在运行

7、currentThreadId:返回当前线程ID

8、setPriority:设置线程优先级

9、yieldCurrentThread():释放当前线程的时间片,允许其它线程执行

10、msleep():让当前线程休眠指定毫秒数

四、QThread的退出方式

1、重写run函数的方式退出,这个我们好控制。但是使用MoveToThread的方式,在退出线程的时候经常会碰到崩溃的情况,如下:

Destroyed while thread is still running 

2、说明线程还没有退出循环就被强制释放了资源,意思就是线程还在运行过程中被释放,就造成了崩溃。所以我们在给线程发出退出指令之后,还要等待线程执行完此次事件循环,再才能销毁这个thread指针。

//错误案例1
thread->quit();
delete trhead;//错误案例2
thread->terminate();
delete thread;

 上面都是不安全的代码,不要使用

3、安全的退出方式

(1)使用QThread的finished信号绑定QObject的deleteLater函数实现自动释放

	TestObject* object = new TestObject;QThread* thread = new QThread;object->moveToThread(thread );connect(thread,&QThread::finished,object,&TestObject::deleteLater);	// 退出后释放TestObject对象资源connect(thread,&QThread::finished,thread,&QThread::deleteLater);	// 退出后释放QThread对象资源thread->start();

(2)绑定函数退出

void MyWork::deleteThread(QThread *thread)
{thread->quit();thread->wait();delete thread;
}connect(myWoker, &MyWorker::signalFinished, myWoker, &QObject::deleteLater);
connect(myWoker, &QObject::destroyed, this, [thread, this]() { deleteThread(thread); });

五、两种方式的使用场景

1、QThread使用场景

(1)当需要创建一个独立的线程来执行某个任务,且需要对线程的整个生命周期进行管理时,适合使用 QThread 方式。

(2)当任务逻辑相对简单或独立,不需要频繁地进行线程间通信时,可以选择使用 QThread 方式。

2、moveToThread方式

(1)当需要将一个 QObject 对象移动到指定的线程中执行任务,或者需要多个对象在同一线程中协同工作时,适合使用 moveToThread() 方式。

(2)当需要灵活地控制对象和线程之间的关系,进行复杂的线程间通信时,可以选择使用 moveToThread() 方式。

http://www.tj-hxxt.cn/news/76978.html

相关文章:

  • 广告公司简介ppt百度网站优化软件
  • 做的最好的网站做销售怎样去寻找客户
  • 搜索网站排名优化策略网络推广方法有哪几种
  • 微山网站建设公司企业网站优化哪家好
  • 网站建设与 宣传关系合肥seo公司
  • 山西省建设局网站广州网站制作服务
  • 小程序制作方案长沙seo全网营销
  • 今年最流行的装修风格seo优化软件大全
  • 武汉网站建设推广橘子seo
  • 网站什么做的青岛疫情最新情况
  • 中国建设银行官网站信用卡管理廊坊seo整站优化软件
  • 珠海做网站的公司有哪些淘宝seo是什么意思
  • 浙江响应式网站建设制作个人网站首页设计
  • 做海报的网站什么编辑seo数据是什么
  • 网站建设设计思想精准引流推广团队
  • 温州网站建设推广服务seo搜索培训
  • wordpress无法创建数据库seo短视频网页入口引流
  • 西二旗网站建设百度大数据分析平台
  • 武汉政务网站开发广告软文外链平台
  • WordPress好用的主题推荐搜索优化的培训免费咨询
  • 开源建站工具百度seo收费
  • 纪检监察新闻网站建设方案网络营销主要是什么
  • 广东专业移动网站服务商拼多多seo怎么优化
  • 可以做图的网站下载百度极速版免费安装
  • 电商网站后台建设问题北京本地网络推广平台
  • 做网站要的带宽是什么免费信息推广网站
  • 自己做网站用买域名吗站长之家域名信息查询
  • 广州有名的网站建设公司保定seo推广
  • 网络规划设计师月薪seo的中文含义是
  • 传播公司可以做门户网站吗企业培训员工培训平台