写一个简单的demo做个实验:
#include "widget.h"
#include "ui_widget.h"
#include <QTimer>
#include <QThread>
#include <iostream>
using namespace std;
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{
QTimer::singleShot(2000, this, [=](){
cout<<"woshuile";
QThread::msleep(2000);
cout<<"woxingle";
});
}
把timeout设置为0的时候现象很明显,界面立马就卡死了,说明QThread::msleep(2000)占用了UI线程(主线程).
把timeout设置为2000的时候,快速点击了几下button,界面卡了十几秒之后恢复.
基本上石锤:QTimer timeout之后在其对象所在的线程中执行.

本文探讨了如何在Qt中使用QThread和QTimer在UI线程外执行耗时操作。实验显示,当QTimer timeout设置为0时,会导致UI冻结。设置为2000毫秒时,延迟执行效果明显,证实了QTimer在指定线程的行为。
6万+

被折叠的 条评论
为什么被折叠?



