QT定时器的一些注意

时间:2021-03-24 00:11:49

1 QTimer必须在有事件循环的线程中运行。如果没有事件循环。那么不会得到timeout的信号。

 因为QTimer底层实质上就是基于事件机制的



2 在UI线程里面的QTimer  timeout连接的信号中执行Sleep或者while等操作会阻塞UI,这个是肯定的。如果使用QDialog带有exec的操作呢?

带有exec的操作是可以继续QT UI的。因为exec实际上就是实现eventloop。所以UI不会被阻塞。但是timeout不会在exec返回前再次被触发


如下假设定时器每秒执行一次


connect(timout,TimeoutFunc);

void TimeoutFunc()

{

      print ("hello")

      QDialog.exec()

}

当QDialog.exec执行的时候。如果不关闭Dialog。print hello不会被再次运行。主要是timeout执行slot的时候需要执行完毕,再重置一下timer的状态。slot没有返回。timer状态没有重置。即时有exec的事件循环也不会再运行。如果在TimeoutFunc里面使用emit发射一个信号。在另一个slotA里面QDialog.exec().并且这个slotA是queueconnection连接的(实质是排除DIrectConnection)。那么就会每隔一秒弹出一个Dlg.