--- src/kernel/qeventloop_unix.cpp +++ src/kernel/qeventloop_unix.cpp @@ -517,6 +531,17 @@ return (tm->tv_sec*1000) + (tm->tv_usec/1000); } +static QString fullName(QObject* obj) +{ + QString oname; + if (obj && obj->name()) + oname = QString(obj->name()) + "(" + QString(obj->className()) + ")"; + + if (obj && obj->parent()) + return fullName(obj->parent()) + "/" + oname; + return oname; +} + int QEventLoop::activateTimers() { if ( !timerList || !timerList->count() ) // no timers @@ -552,9 +577,27 @@ t->timeout += t->interval; if ( t->timeout < currentTime ) t->timeout = currentTime + t->interval; + // prefer system clock ticks for low resolution timers + // to save cpu power + if (t->interval.tv_sec * 1000 + t->interval.tv_usec / 1000 >= 1000) { + timeval drift; + drift.tv_sec = 0; + drift.tv_usec = (t->interval.tv_usec / 8) + (t->interval.tv_sec % 8) * 1000 * 1000 / 8; + timeval synced = t->timeout + drift; + if (synced.tv_usec < 2 * drift.tv_usec) + synced.tv_usec = 0; + t->timeout = synced; + } insertTimer( t ); // relink timer if ( t->interval.tv_usec > 0 || t->interval.tv_sec > 0 ) n_act++; + + if (t->obj && getenv("QT_DEBUG_TIMER")) + qDebug("qtimer: %ld/%s %d ms for %p/%s %s", + getpid(), qApp && qApp->name() ? qApp->name() : "", + t->interval.tv_sec * 1000 + t->interval.tv_usec / 1000, + t->obj, fullName(t->obj).latin1(), t->obj->className()); + QTimerEvent e( t->id ); QApplication::sendEvent( t->obj, &e ); // send event if ( timerList->findRef( begin ) == -1 )