qt延时界面线程的问题,深夜求解答

在线程中使用延时2ms,打印出来却是20多毫秒,弹出QMessagebox阻塞主界面后延时又正常,不知道什么原因,代码如下:

void MainWindow::on_pushButton_clicked()
{
    std::thread th(&MainWindow::test,this);
    th.detach();
}

void MainWindow::test()
{
    int i = 0;
    while (i<3000)
    {
        QTime a = QTime::currentTime();
        QThread::msleep(2);
        QTime b = QTime::currentTime();
        qDebug()<<a.msecsTo(b);
        i++;
    }
}

void MainWindow::on_pushButton_2_clicked()
{
    qDebug()<<"QMessageBox Pop";
    QMessageBox::information(this,"11","11");
}

输出如下

16
27
26
27
16
26
27
26
27
28
QMessageBox Pop
3
3
3
3
2
2
3
3
3
3
3
3
3

因为线程并不一定是跟主线程并行运行的,有时候,主线程和子线程公用一个cpu,cpu会把时间划分为一个一个的时间片,如果主线程和子线程公用一个cpu,那么他们就会争抢时间片,谁抢到了时间片就在这个时间片运行,这时候,就不是并行运行了,在子线程计时的时候,就会出现时间误差。

据说Windows系统切换线程大约耗时15ms

试试用qt的线程

    QFuture<void> result = QtConcurrent::run([]() {
        qDebug() << "thread";
    });
    result.waitForFinished();