引言
前面几篇已经对C++的线程做了简单的总结,浅谈C++11中的多线程(三) - 唯有自己强大 - 博客园 (cnblogs.com)。本篇着重于Qt多线程的总结与实现。

跟C++11中很像的是,Qt中使用QThread来管理线程,一个QThread对象管理一个线程,在使用上有很多跟C++11中相似的地方,但更多的是Qt中独有的内容。另外,QThread对象也有消息循环exec()函数,即每个线程都有一个消息循环,用来处理自己这个线程的事件。

一,知识回顾
首先先来回顾一下一些知识点:

1,为什么需要多线程?

解决耗时操作堵塞整个程序的问题,一般我们会将耗时的操作放入子线程中

**2,进程和线程的区别:**

进程:一个独立的程序,拥有独立的虚拟地址空间,要和其他进程通信,需要使用进程通信的机制。

线程:没有自己的资源,都是共享进程的虚拟地址空间,多个线程通信存在隐患。

ps:在操作系统每一个进程都拥有独立的内存空间,线程的开销远小于进程,一个进程可以拥有多个线程。(因此我们常用多线程并发,而非多进程并发)

为了更容易理解多线程的作用,先看一个实例:

在主线程中运行一个10s耗时的操作。(通过按钮来触发)

#include "threadtest.h"
#include"qthread.h"
Threadtest::Threadtest(QWidget* parent): QMainWindow(parent)
{ui.setupUi(this);connect(ui.btn_start, &QPushButton::clicked, this, &Threadtest::on_pushButton_clicked);}
void Threadtest::on_pushButton_clicked()
{QThread::sleep(10);//主线程
}

可以看到程序运行过程中,整个线程都在响应10秒的耗时操作,对于线程的消息循环exec()函数就未响应了(就是你在这个过程中拖动界面是无反应的)
在这里插入图片描述

二,线程类 QThread
Qt 中提供了一个线程类,通过这个类就可以创建子线程了,Qt 中一共提供了两种创建子线程的方式,后边会依次介绍其使用方式。先来看一下这个类中提供的一些常用 API 函数:

2.1 常用共用成员函数

// QThread 类常用 API
// 构造函数
QThread::QThread(QObject *parent = Q_NULLPTR);
// 判断线程中的任务是不是处理完毕了
bool QThread::isFinished() const;
// 判断子线程是不是在执行任务
bool QThread::isRunning() const;// Qt中的线程可以设置优先级
// 得到当前线程的优先级
Priority QThread::priority() const;
void QThread::setPriority(Priority priority);
优先级:QThread::IdlePriority        --> 最低的优先级QThread::LowestPriorityQThread::LowPriorityQThread::NormalPriorityQThread::HighPriorityQThread::HighestPriorityQThread::TimeCriticalPriorityQThread::InheritPriority    --> 最高的优先级, 默认是这个// 退出线程, 停止底层的事件循环
// 退出线程的工作函数
void QThread::exit(int returnCode = 0);
// 调用线程退出函数之后, 线程不会马上退出因为当前任务有可能还没有完成, 调回用这个函数是
// 等待任务完成, 然后退出线程, 一般情况下会在 exit() 后边调用这个函数
bool QThread::wait(unsigned long time = ULONG_MAX);

2.2 信号槽

// 和调用 exit() 效果是一样的
// 代用这个函数之后, 再调用 wait() 函数
[slot] void QThread::quit();
// 启动子线程
[slot] void QThread::start(Priority priority = InheritPriority);
// 线程退出, 可能是会马上终止线程, 一般情况下不使用这个函数
[slot] void QThread::terminate();// 线程中执行的任务完成了, 发出该信号
// 任务函数中的处理逻辑执行完毕了
[signal] void QThread::finished();
// 开始工作之前发出这个信号, 一般不使用
[signal] void QThread::started();

2.3静态函数

// 返回一个指向管理当前执行线程的QThread的指针
[static] QThread *QThread::currentThread();
// 返回可以在系统上运行的理想线程数 == 和当前电脑的 CPU 核心数相同
[static] int QThread::idealThreadCount();
// 线程休眠函数
[static] void QThread::msleep(unsigned long msecs);    // 单位: 毫秒
[static] void QThread::sleep(unsigned long secs);    // 单位: 秒
[static] void QThread::usleep(unsigned long usecs);    // 单位: 微秒

三,Qt中实现多线程的两种方法
🧡🧡3.1.派生QThread类对象的方法(重写Run函数)

首先,以文字形式来说明需要哪几个步骤。

自定义一个自己的类,使其继承自QThread类;
在自定义类中覆写QThread类中的虚函数run()。
这很可能就是C++中多态的使用。补充一点:QThread类继承自QObject类。

这里要重点说一下run()函数了。它作为线程的入口,也就是线程从run()开始执行,我们打算在线程中完成的工作都要写在run()函数中,个人认为可以把run()函数理解为线程函数。这也就是子类覆写基类的虚函数,基类QThread的run()函数只是简单启动exec()消息循环,关于这个exec()后面有很多东西要讲,请做好准备。
那么我们就来尝试用多线程实现10s耗时的操作:(用按钮触发)

1️⃣在编辑好ui界面后,先创建一个workThread的类。(继承自QThread类)
在这里插入图片描述

2️⃣在workThread1的类中重写run函数
在workThread.h的声明run函数:

#include <qthread.h>
class workThread : public QThread
{
public:void run();
};

在workThread.cpp中重写run函数(并打印子线程的ID):

#include "workThread.h"
#include"qdebug.h"
workThread::workThread(QObject* parent)
{}
//重写run函数
void workThread::run()
{qDebug() << "当前子线程ID:" << QThread::currentThreadId();qDebug() << "开始执行线程";QThread::sleep(10);qDebug() << "线程结束";
}

3️⃣在主类中启动线程
threadtest.h中声明线程和按钮事件

#include <QtWidgets/QMainWindow>
#include "ui_threadtest.h"
#include"workThread.h"
#pragma execution_character_set("utf-8")
class Threadtest : public QMainWindow
{Q_OBJECTpublic:Threadtest(QWidget *parent = Q_NULLPTR);private:Ui::ThreadtestClass ui;void btn_clicked();
workThread* thread;
};

threadtest.cpp中实现,并启动子线程线程

#include "threadtest.h"
#include"qthread.h"
#include"qdebug.h"Threadtest::Threadtest(QWidget* parent): QMainWindow(parent)
{ui.setupUi(this);connect(ui.btn_start, &QPushButton::clicked, this, &Threadtest::btn_clicked);thread = new workThread(this);  
}
void Threadtest::btn_clicked()
{qDebug() << "主线程id:" << QThread::currentThreadId();thread->start();//启动子线程
}

可以实现,在执行耗时操作时也可拖动界面。
在这里插入图片描述

在这里插入图片描述

需要注意的是:

在主程序中添加workThread类的头文件时,需要将workThread.h放在threadtest.h中(不然会报错!!!!)
在这里插入图片描述

使用QThread::currentThreadId()来查看当前线程的ID,无论是子线程还是主线程,不同线程其ID是不同的。注意,这是一个静态函数,因此可以不经过对象来调用。

创建的workThread1类的执行实际上是在主线程里的,只有run函数内的程序才会在子线程中执行!(即QThread只是线程的管理类,只有run()才是我们的线程函数)

因此在QThread(即创建的类)中的成员变量属于主线程,在访问前需要判断访问是否安全。run()中创建的变量属于子线程。

线程之间共享内存是不安全的(由于多线程争夺资源会影响数据安全问题),解决的办法就是要上锁。

关于互斥锁

互斥锁是一种简单的加锁的方法来控制对共享资源的访问。只要某一个线程上锁了,那么就会强行霸占公共资源的访问权,其他的线程无法访问直到这个线程解锁了,从而保护共享资源。

在Qt中的互斥锁常用两种方式:

QMutex类下的lock(上锁)和unlcok(解锁)

//需要在头文件中引用#include<QMutex>
//并在头文件的private中声明QMutex mutex;mutex.lock()
public_value++//公共成员变量
mutex.unlock();

QMutexLocker类下的lock(上锁后,当执行析构函数时会自动解锁)

//需要在头文件中引用#include<QMutexLocker>和include<QMutex>
//并在头文件的private中声明QMutex mutex;QMutexLocker lock(&mutex);//执行构造函数时执行mutex.lock()
public_value++;//执行析构函数时执行mutex.unlock()

关于exec()消息循环

个人认为,exec()这个点太重要了,同时还不太容易理解。

比如下面的代码中有两个exec(),我们讲“一山不容二虎”,放在这里就是说,一个线程中不能同时运行两个exec(),否则就会造成另一个消息循环得不到消息。像QDialog模态窗口中的exec()就是因为在主线程中同时开了两个exec(),导致主窗口的exec()接收不到用户的消息了。但是!但是!但是!我们这里却没有任何问题,因为它们没有出现在同一个线程中,一个是主线程中的exec(),一个是子线程中的exec()。

#include <QApplication>
#include <QThread>
#include <QDebug>class MyThread:public QThread
{public:void run(){qDebug()<<"child thread begin"<<endl;qDebug()<<"child thread"<<QThread::currentThreadId()<<endl;QThread::sleep(5);qDebugu()<<"QThread end"<<endl;this->exec();}
};int main(int argc,char ** argv) //mian()作为主线程
{QApplication app(argc,argv);MyThread thread; //创建一个QThread派生类对象就是创建了一个子线程thread.start(); //启动子线程,然后会自动调用线程函数run()qDebug()<<"main thread"<<QThread::currentThreadId()<<endl;QThread::sleep(5);qDebugu()<<"main thread"<<QThread::currentThreadId()<<endl;thread.quit(); //使用quit()或者exit()使得子线程能够退出消息循环,而不至于陷在子线程中thread.wait(); //等待子线程退出,然后回收资源//thread.wait(5000); //设定等待的时间return app.exec();    
}

如果run()函数中没有执行exec()消息循环函数,那么run()执行完了也就意味着子线程退出了。一般在子线程退出的时候需要主线程去回收资源,可以调用QThread的wait(),使主线程等待子线程退出,然后回收资源。这里wait()是一个阻塞函数,有点像C++11中的join()函数。

但是!但是!但是!run()函数中调用了exec()函数,exec()是一个消息循环,也可以叫做事件循环,也是会阻塞的,相当于一个死循环使子线程卡在这里永不退出,必须调用QThread的quit()函数或者exit()函数才可以使子线程退出消息循环,并且有时还不是马上就退出,需要等到CPU的控制权交给线程的exec()。

所以先要thread.quit();使退出子线程的消息循环, 然后thread.wait();在主线程中回收子线程的资源。

值得注意的有两点:子线程的exet()消息循环必须在run()函数中调用;如果没有消息循环的话,则没有必要调用quit( )或者exit(),因为调用了也不会起作用。

第一种创建线程的方式需要在run()中显式调用exec(),但是exec()有什么作用呢,目前还看不出来,需要在第二种创建线程的方式中才能知道。

💜💜3.2.使用信号与槽方式来实现多线程

刚讲完使用QThread派生类对象的方法创建线程,现在就要来说它一点坏话。这种方法存在一个局限性,只有一个run()函数能够在线程中去运行,但是当有多个函数在同一个线程中运行时,就没办法了,至少实现起来很麻烦。所以,当当当当,下面将介绍第二种创建线程的方式:使用信号与槽的方式,也就是把在线程中执行的函数(我们可以称之为线程函数)定义为一个槽函数。

仍然是首先以文字形式说明这种方法的几个步骤。

创建一个新的类(mywork),让这个类从 QObject 派生,在这个类中添加一个公共的成员函数(working),函数体就是我们要子线程中执行的业务逻辑

class MyWork:public QObject
{
public:.......// 函数名自己指定, 叫什么都可以, 参数可以根据实际需求添加void working();
}

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

QThread* sub = new QThread;

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

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

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

// void QObject::moveToThread(QThread *targetThread);
// 如果给work指定了父对象, 这个函数调用就失败了
// 提示: QObject::moveToThread: Cannot move objects with a parent
work->moveToThread(sub);    // 移动到子线程中工作

启动子线程,调用 start(), 这时候线程启动了,但是移动到线程中的对象并没有工作
调用 MyWork 类对象的工作函数,让这个函数开始执行,这时候是在移动到的那个子线程中运行的
代码实例:

1️⃣创建一个workThread的类。(继承自QThread类)
定义槽函数(子线程执行的程序都可以放在槽函数中)

//workThread.cpp(先在workThread.h中声明槽函数)void workThread:: doWork(){qDebug()<<"当前线程ID:"<<QThread::currentThreadId();qDebug()<<"开始执行";QThread::sleep(10);    qDebug()<<"结束执行";}

2️⃣主线程中分别对workThread类和QTread类实例化
在threadtest.h中声明

#include <QtWidgets/QMainWindow>
#include "ui_threadtest.h"
#include"workThread.h"
#include"qthread.h"
#pragma execution_character_set("utf-8")
class Threadtest : public QMainWindow
{Q_OBJECTpublic:Threadtest(QWidget *parent = Q_NULLPTR);  
private:Ui::ThreadtestClass ui;void btn_clicked();workThread* thread; //实例化workThread类QThread* qthread;   //实例化QThread类
};

在threadtest.cpp中实现并通过moveToThread将自己放到线程QThread对象中,最后启动线程

#include "threadtest.h"
#include"qthread.h"
#include"qdebug.h"Threadtest::Threadtest(QWidget* parent): QMainWindow(parent)
{ui.setupUi(this);//不能指定自定义类的对象的父类为widget,即没有this(很重要!!!!)thread = new workThread();  qthread1 = new QThread(this);thread->moveToThread(qthread1);//线程结束时清理线程内存connect(qthread1, &QThread::finished, qthread1, &QThread::deleteLater);//将按钮事件(信号)绑定槽函数connect(ui.btn_start, &QPushButton::clicked, thread, &workThread::dowork);//打印主线程connect(ui.btn_start, &QPushButton::clicked, [=]() {qDebug() << "主线程id:" << QThread::currentThreadId();});//线程启动qthread1->start();
}

在运行槽函数时,不能在此直接调用(如:thread1->doWork())。而是用connect连接信号和槽

这里将打印主线程和槽函数都绑定在了button按钮的click事件上了。
在这里插入图片描述

在这里插入图片描述

特别需要注意的是(爬坑记录):

子线程中不能操作UI
Qt创建的子线程中是不能对UI对象进行任何操作的,即QWidget及其派生类对象,这个是我掉的第一个坑。可能是由于考虑到安全性的问题,所以Qt中子线程不能执行任何关于界面的处理,包括消息框的弹出。正确的操作应该是通过信号槽,将一些参数传递给主线程,让主线程(也就是Controller)去处理。
自定义的类不能指定父对象
比如上面程序中的:(不能指定自定义类对象为widget,即不可以加this)

thread1=new workThread1();//初始化

QThread和connect的关系
我们使用最多的是QThread于connect的关系,在使用connect函数的时候,我们一般会把最后一个参数忽略掉。这时候我们需要看下函数原型:

[static] QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)

可以看到,最后一个参数代表的是连接的方式。我们一般会用到方式是有三种:

自动连接(AutoConnection):默认的连接方式。如果信号与槽,也就是发送者与接受者在同一线程,等同于直接连接;如果发送者与接受者处在不同线程,等同于队列连接。

直接连接(Direct Connection):当信号发射时,槽函数将直接被调用。无论槽函数所属对象在哪个线程,槽函数都在发射者所在线程执行。

队列连接(Queued Connection):当控制权回到接受者所在线程的事件循环式,槽函数被调用。槽函数在接收者所在线程执行。

因此我们需要注意的是:

主线程对象发出信号连接QThread子类的槽函数,QThread子类对象在主线程创建的,无论采用哪种连接方式,槽函数都属在主线程调用。(如果在重写的run函数中调用了槽函数,此时槽函数在次线程执行,注意数据安全)。
次线程run中发出信号,槽函数可以是发出信号对象自身的槽函数,自发自收,都是次线程中行。槽函数是QThread子类的槽函数,或者主线程中对象的槽函数,这里的种情况需要你指明run中connect中的连接方式,直连则该槽函数在次线程中执行(可能发生数据安全问题),列队则在主线程执行。
🧡🧡总结一下:

一定要用信号槽机制,别想着直接调用,你会发现并没有在子线程中执行。

自定义的类不能指定父对象,因为moveToThread函数会将线程对象指定为自定义的类的父对象,当自定义的类对象已经有了父对象,就会报错。

当一个变量需要在多个线程间进行访问时,最好加上voliate关键字,以免读取到的是旧的值。当然,Qt中提供了线程同步的支持,比如互斥锁之类的玩意,使用这些方式来访问变量会更加安全。

分析发出信号的对象和接受信号对象所在的线程,再通过连接方式,判断槽函数在哪里执行。(小白在使用中就有在run中创建对象-因为多非槽函数都需要在次线程中执行,通过指针引出来,再connect与其他模块交互,指明连接方式为列队形式,所以相关执行都在次线程中执行)。这里记住moveToThread只能将槽函数移到次线程中。

启动多线程的操作思路

如果我们需要实现一个排序操作,即首先获取1000个随机数,然后用冒泡排序法对其进行排序。

方法一:重写run函数

思路:(构建两个子线程,一个用于生成随机数,一个用于冒泡排序,主线程负责调用)

新建myThread类,在该类中重写run函数(即生随机数)。需要先接收主线程发送的要生成随机数的个数(scvnum信号)后再进行生成,生成完成以后发送一个sendArray信号
新建BubbleSort类,在该类中重写run函数(即冒泡排序算法)。需要先接收已经生成的随机数(rcvArray信号)后再进行排序,排序完成后发送一个finish信号
主线程通过stating信号告诉myThread线程要生成的个数,然后myThread线程通过scvnum信号接收,进行生成随机数,然后再发送一个sendArray信号(即生成随机数集合)
BubbleSort子线程通过rcvArray信号接收sendArray信号(即接收随机数)然后进行冒泡排序,再发送finish信号
主线程接收到finish信号后,将排序后的随机数显示在界面上
实现代码:

子线程.h

#pragma once
#include"qthread.h"
#include"qvector.h"
//新建随机数类
class myThread :public QThread
{Q_OBJECT
public:myThread(QObject* parent = nullptr);void scvnum(int num);//接收数字
protected:void run();
signals:void sendArray(QVector<int>num);//发送
private:int m_num;
};//新建冒泡排序类
class BubbleSort :public QThread
{Q_OBJECT
public:BubbleSort(QObject* parent = nullptr);void rcvArray(QVector<int>list);//要接收的是排序的数
protected:void run();
signals:void finish(QVector<int>list);//排序完成后发送一个finish信号
private:QVector<int>m_list;
};

子线程.cpp

#include "myThread.h"
#include"qelapsedtimer.h"
#include"qdebug.h"myThread::myThread(QObject* parent) :QThread(parent)
{}
BubbleSort::BubbleSort(QObject* parent) : QThread(parent)
{}void myThread::scvnum(int num)
{m_num = num;
}void myThread::run()
{qDebug() << "child thread id" << QThread::currentThreadId();QVector<int> list;QElapsedTimer time;time.start();for (int i = 0; i < m_num; i++){list.push_back(qrand() % 100000);}int milsec = time.elapsed();qDebug() << "The number of" << m_num << "generated";qDebug() << "shared" << milsec << "second";emit sendArray(list);
}void BubbleSort::rcvArray(QVector<int> list)
{m_list = list;
}void BubbleSort::run()
{qDebug() << "BubbleSort thread id:" << QThread::currentThreadId();QElapsedTimer time;time.start();int temp;for (int i = 0; i < m_list.size(); ++i){for (int j = 0; j < m_list.size()-i-1; ++j){if (m_list[j] > m_list[j + 1]){temp = m_list[j];m_list[j] = m_list[j + 1];m_list[j + 1] = temp;}}}int milsec = time.elapsed();qDebug() << "shared" << milsec << "second";emit finish(m_list);
}

主线程.h

#include <QtWidgets/QWidget>
#include"ui_list.h"class list : public QWidget
{Q_OBJECTpublic:list(QWidget *parent = Q_NULLPTR);
signals:void stating(int num);//设置要生成随机数个数private:Ui::listClass ui;
};

主线程.cpp

#include "list.h"
#include"myThread.h"
list::list(QWidget *parent): QWidget(parent)
{ui.setupUi(this);//1.创建子线程对象myThread* thread = new myThread();BubbleSort* bub_thread = new BubbleSort();//向子线程发送要生成的随机数个数connect(this,&list::stating, thread, &myThread::scvnum);//2启动子线程connect(ui.pushButton, &QPushButton::clicked,  [=]() {emit stating(1000);//主线程设置子线程随机数的个数thread->start();});connect(thread, &myThread::sendArray, bub_thread, &BubbleSort::rcvArray);//3接收子线程发送的数据connect(thread, &myThread::sendArray,  [=](QVector<int>list) {for (int i = 0; i < list.size(); ++i){ui.randlist->addItem(QString::number(list.at(i)));}});connect(thread, &myThread::sendArray, [=](QVector<int>list){bub_thread->start();});connect(bub_thread, &BubbleSort::finish, [=](QVector<int>list) {for (int i = 0; i < list. size(); ++i){ui.bubblelist->addItem(QString::number(list.at(i)));}});
}

实现效果:
在这里插入图片描述

方法二:moveToThread()

思路:

新建myThread类,用于生成随机数(working函数),在接受到主线程的信号后开始生成随机数
新建BubbleSort类,用于排序(working函数),在接受到myThread类生成的随机数后开始排序
最后显示在界面
代码实现:

子线程.h

#pragma once
#include"qthread.h"
#include"qvector.h"
#include"qobject.h"
//新建随机数类
class myThread :public QObject
{Q_OBJECT
public:myThread(QObject* parent = nullptr);void working(int num);//生成随机数
signals:void sendArray(QVector<int>num);//发送
private:int m_num;
};//新建冒泡排序类
class BubbleSort :public QObject
{Q_OBJECT
public:BubbleSort(QObject* parent = nullptr);void working(QVector<int>list);//要接收的是排序的数signals:void finish(QVector<int>list);//排序完成后发送一个finish信号};

子线程.cpp

#include "myThread.h"
#include"qelapsedtimer.h"
#include"qdebug.h"myThread::myThread(QObject* parent) :QObject(parent)
{}
BubbleSort::BubbleSort(QObject* parent) : QObject(parent)
{}void myThread::working(int num)
{qDebug() << "child thread id" << QThread::currentThreadId();QVector<int> list;QElapsedTimer time;time.start();for (int i = 0; i < num; i++){list.push_back(qrand() % 100000);}int milsec = time.elapsed();qDebug() << "The number of" << m_num << "generated";qDebug() << "shared" << milsec << "second";emit sendArray(list);
}void BubbleSort::working(QVector<int>list)
{qDebug() << "BubbleSort thread id:" << QThread::currentThreadId();QElapsedTimer time;time.start();int temp;for (int i = 0; i < list.size(); ++i){for (int j = 0; j < list.size()-i-1; ++j){if (list[j] > list[j + 1]){temp = list[j];list[j] = list[j + 1];list[j + 1] = temp;}}}int milsec = time.elapsed();qDebug() << "shared" << milsec << "second";emit finish(list);
}

主线程.h

#include <QtWidgets/QWidget>
#include"ui_list.h"class list : public QWidget
{Q_OBJECTpublic:list(QWidget *parent = Q_NULLPTR);
signals:void stating(int num);//设置要生成随机数个数private:Ui::listClass ui;
};

主线程.cpp

#include "list.h"
#include"myThread.h"
list::list(QWidget *parent): QWidget(parent)
{ui.setupUi(this);//1.创建QThread对象QThread* thread1 = new QThread;QThread* thread2 = new QThread;//2.创建子线程类对象myThread* myth = new myThread();BubbleSort* bub = new BubbleSort();//3通过movetothread将子线程对象移动到QThread对象中myth->moveToThread(thread1);bub->moveToThread(thread2);//4启动子线程//先向子线程发送要生成的随机数个数connect(this,&list::stating, myth, &myThread::working);//再启动子线程connect(ui.pushButton, &QPushButton::clicked,  [=]() {emit stating(1000);//主线程设置子线程随机数的个数thread1->start();        });//将生成好的随机数发送给BubbleSort类connect(myth, &myThread::sendArray, bub, &BubbleSort::working);//将生成好的随机数显示在界面connect(myth, &myThread::sendArray,  [=](QVector<int>list) {for (int i = 0; i < list.size(); ++i){ui.randlist->addItem(QString::number(list.at(i)));}});//发送的同时启动排序算法connect(myth, &myThread::sendArray, [=](QVector<int>list){thread2->start();});//将排序好的数显示在界面connect(bub, &BubbleSort::finish, [=](QVector<int>list) {for (int i = 0; i < list. size(); ++i){ui.bubblelist->addItem(QString::number(list.at(i)));}});
}

结论

通过对比,我们可以发现:

由于第二种方法,我们可以自定义带参的子线程运行函数,因此代码更加简洁。
在第二种方法中,我们还可以随意修改需要在哪个线程中运行,代码也更加灵活。
第一种方法适合在线程中处理单一事件,其逻辑简单(只需要新建一个继承自QThread类的对象,重写run函数,然后启动即可),对于需要在一个线程中处理多个事件,还是用第二种方法比较好。
为什么不能在第二种方法中,给定义的子线程对象添加父类呢? :由于添加了父类以后就不能再移动到QThread中去了
如何进行线程资源的释放?

在new对象时候,直接用this指定其父类(即放入对象数中)
在程序最后自行释放资源

connect(this, &list::destroyed, this, [=]() {thread1->quit();thread1->wait();thread1->deleteLater();thread2->quit();thread2->wait();thread2->deleteLater();myth->deleteLater();bub->deleteLater();});
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 2022-2028年全球与中国电子过载继电器行业深度分析

    本文研究全球与中国市场电子过载继电器的发展现状及未来发展趋势&#xff0c;分别从生产和消费的角度分析电子过载继电器的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场…...

    2024/4/16 21:18:19
  2. 将vsCode添加到windows电脑右键菜单

    一 打开vscode 1、打开注册表 快捷键&#xff1a; winr 输入 regedit 2、打开对应文件目录 HKEY_CLASSES_ROOT\Directory\Background\shell &#xff1b; (1)、background 下的 shell 新建一个项&#xff0c;名字起名叫 open in vsCode(可以自己起名字) (2)、 在open in…...

    2024/4/14 19:23:03
  3. 2022-2028年全球与中国汽车缓冲弹簧行业发展趋势及竞争策略研究

    本文研究全球与中国市场汽车缓冲弹簧的发展现状及未来发展趋势&#xff0c;分别从生产和消费的角度分析汽车缓冲弹簧的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场主要…...

    2024/4/15 14:11:48
  4. 2022-2028年全球与中国有线接口行业市场前瞻与投资战略规划分析

    本文研究全球与中国市场有线接口的发展现状及未来发展趋势&#xff0c;分别从生产和消费的角度分析有线接口的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场主要生产商的…...

    2024/4/14 19:22:48
  5. u-boot分析与使用

    一、u-boot介绍 u-boot即通用的BootLoader&#xff0c;是遵循GPL条款的开放源代码项目。“通用”有两层含义&#xff1a;可以引导多种操作系统、支持多种架构的CPU。他支持如下操作系统&#xff1a;Linux、VxWorks等&#xff0c;支持如下架构的CPU&#xff1a;PowerPC、MIPS、…...

    2024/4/5 5:27:02
  6. 抽样调查之分层抽样

    1、在某工业系统所属企业中&#xff0c;中型100个&#xff0c;小型400个。采用简单随机抽样&#xff0c;以企业为单元&#xff0c;分别从两类企业中抽取3个企业和5个企业&#xff0c;记录1990年的工业总产值&#xff08;单位&#xff1a;千元&#xff09;。3个中型企业分别为12…...

    2024/4/14 19:22:53
  7. 2022-2028年全球与中国光电倍增管行业发展趋势及投资战略分析

    本文研究全球与中国市场光电倍增管的发展现状及未来发展趋势&#xff0c;分别从生产和消费的角度分析光电倍增管的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场主要生产…...

    2024/4/7 3:38:34
  8. JS 深浅拷贝

    简介 浅拷贝&#xff1a;拷贝基本数据类型的值&#xff0c;但对于引用数据类型&#xff0c;只拷贝他在堆内存中的地址&#xff0c;修改新数据或者原数据都会引起原数据的改变深拷贝&#xff1a;把所有数据都赋值到新的内存空间&#xff0c;是最彻底的拷贝 浅拷贝方法 1.Obje…...

    2024/4/7 3:38:32
  9. C++基础学习笔记

    C常量与变量&#xff1a; 1.常量的定义方式 格式&#xff1a; #define 宏常量 值 例&#xff1a; #include <iostream> using namespace std; #define Day 7 //常量&#xff1a;顾名思义&#xff0c;一经定义不可修改&#xff0c;故常常写到函数外 int main() {…...

    2024/4/7 3:38:31
  10. 记 事 本

    1. 案例介绍 tkinter 是 Python下面向 tk 的图形界面接口库&#xff0c;可以方便地进行图形界面设计和交互操作编程。tkinter 的优点是简单易用、与 Python 的结合度好。tkinter 在 Python 3.x 下默认集成&#xff0c;不需要额外的安装操作&#xff1b;不足之处为缺少合适的可…...

    2024/4/14 19:22:53
  11. 全球及中国数字存储设备行业商业模式分析及投资风险预测2022年版

    本文研究全球与中国市场数字存储设备的发展现状及未来发展趋势&#xff0c;分别从生产和消费的角度分析数字存储设备的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场主要…...

    2024/4/7 3:38:30
  12. SmartInstantiationAwareBeanPostProcessor

    BeanPostProcessor是spring的bean后置处理器&#xff0c;这个接口定义了两个方法分别在bean的初始化前、初始化后执行。 InstantiationAwareBeanPostProcessor继承自BeanPostProcessor&#xff0c;添加了两个方法&#xff0c;这两个方法分别在bean的实例化前、实例化后执行。 …...

    2024/4/14 19:23:13
  13. KVM虚拟机安装

    一、 依赖服务安装 环境说明&#xff1a; 架构x86环境 centos 1.1、服务安装&启动 安装虚拟机所需软件 yum install libvirt* qemu* virt-manager bridge-utils -y启动服务 systemctl enable libvirtd systemctl start libvirtd 1.2、终端管理 说明&#xff1a; 安装时系…...

    2024/4/14 19:23:34
  14. 1139: 输出最短字符串

    题目描述输入n和n个字符串&#xff0c;输出其中最短的字符串。若长度相同则输出出现较早的那一个。 输入第一行是一个整数n&#xff0c;后面跟着n行&#xff0c;每行包括一个由字母和数字和空格组成的字符串&#xff0c;长度不超过1000。 输出长度最短的字符串&#xff0c;若长…...

    2024/4/14 19:23:49
  15. 公布半小时下载量达10W:阿里团队出品「Java成长笔记」真香

    前言 关于技术人如何成长的问题&#xff0c;一直以来都备受关注&#xff0c;因为程序员职业发展很快&#xff0c;即使是相同起点的人&#xff0c;经过几年的工作或学习&#xff0c;会迅速拉开极大的差距&#xff0c;所以技术人保持学习&#xff0c;提升自己&#xff0c;才能够…...

    2024/4/14 19:23:49
  16. 软件测试作业六

    软件测试作业6 根据下面的程序流程图&#xff0c;完成问题。 1. 转换单条件判定结构 2. 画出相应的程序控制流图 3. 给出控制流图的邻接矩阵 [1110000011100000110000001101000011100000110000001]\begin{bmatrix} 1 & 1 & 1 & 0 & 0 & 0 & 0 \\ 0 &a…...

    2024/4/14 19:23:59
  17. 微信小程序通信模式

    小程序的场景&#xff0c;获取用户数据的方式有所不同&#xff0c;应用服务器不能直接向微信服务器请求数据&#xff0c;而是由小程序向微信服务器获取&#xff0c;微信服务器会将数据使用一个密钥加密&#xff0c;返回给小程序。小程序没有密钥、无法解密这段数据。小程序将该…...

    2024/4/15 16:18:51
  18. python笔记_day1

    Python笔记 文章目录Day1 2022年1月13日-星期四一. 计算机语言1.1程序是什么1.2编程语言1.2.1机器语言——*科学家能写出来*1.2.2汇编语言1.2.3高级语言1.2.3.1 解释型语言1.2.3.2 编译型语言1.3编程语言的比较二. 基本语法2.1输出2.2输入Day1 2022年1月13日-星期四 一. 计算机…...

    2024/4/16 21:18:48
  19. 关于无人直播带货玩法技术你应该知道的

    无人直播的核心是什么&#xff1f;其实很简单&#xff0c;就是突破了真人的局限。降低了直播成本的一种盈利模式。 简单来讲&#xff0c;就是无需真人出境。只要你有手机登录账号&#xff0c;只要你有电脑&#xff08;用来操控你的手机直播间&#xff09;&#xff0c;然后再有…...

    2024/4/14 19:23:59
  20. GDB调试产生printf.c: No such file or directory.的问题

    刚开始学GDB的使用&#xff0c;设置断点s&#xff08;单句执行&#xff09;执行的过程中&#xff0c;抛出错误&#xff0c;直接提示printf.c: No such file or directory.很头疼不知道啥问题。 百度找到了解决办法&#xff0c;并记录在此。 我的源码如下&#xff1a; #include …...

    2024/4/14 19:23:44

最新文章

  1. 解锁流量密码:如何利用HubSpot打造高效的获客策略?(下)

    在当今数字化时代&#xff0c;流量是企业成功的关键。HubSpot作为一款全面的营销自动化工具&#xff0c;为我们提供了强大的支持&#xff0c;帮助企业打造高效的流量获取策略。接下来&#xff0c;我们将从社交媒体与SEO优化、自动化营销流程、数据分析与效果评估以及流量获取策…...

    2024/4/18 19:49:27
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. C# 抽象类、接口

    &#xff08;1&#xff09;、抽象类和抽象方法的定义和实现&#xff1a;abstract override abstract class Vehicle{ public abstract void Run(); } 继承抽象类并且实现抽象方法 class RaceCar : Vehicle{ public override void Run(){ } } &#xff08;2&#xff09;、接口的…...

    2024/4/16 16:41:40
  4. 不重复数字

    map就感觉很舒服 题目描述 给定 n 个数&#xff0c;要求把其中重复的去掉&#xff0c;只保留第一次出现的数。 输入格式 本题有多组数据。 第一行一个整数 T&#xff0c;表示数据组数。 对于每组数据&#xff1a; 第一行一个整数 n。 第二行 n 个数&#xff0c;表示给定的数。…...

    2024/4/17 11:35:08
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/18 0:33:31
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/17 20:29:59
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/18 9:45:31
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/17 2:33:17
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/17 7:50:46
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/18 3:56:01
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/18 3:56:04
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/18 3:55:30
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/18 3:55:54
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/18 3:55:45
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/17 21:50:30
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/15 13:53:08
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/15 9:16:52
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/18 9:24:29
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/18 3:56:18
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/18 3:55:57
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/18 3:55:50
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/15 23:28:22
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/18 3:56:20
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/18 3:56:11
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57