在线程中使用延时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();