Garmaine Staff asked 1 year ago

As I already asked in this post link and got no answer, I need to get an event in exact time to take a picture of the scene in QGraphicsview which is playing some animations to be able to render it to a vide file with 30 fps, the timer isn't precise and also I used the frameChanged event of QTimeLine but it isn't precise too! I wonder so how can I render a QGraphicsview into a vide movie ?

for another solution, I moved the timer and another object with a simple slot into a new Thread, it works well when I do the things in the slot of the object in new thread but as soon as I connect the timeout signal of timer to a slot of my main GUI thread again the slot in main thread triggers late and Irregular while the slot in the object which is in new thread triggers in exact time! see

thread = new QThread();
timer = new QTimer();
pp = new PrecisePolling();

timer->setInterval(33);
timer->setTimerType(Qt::PreciseTimer);

QObject::connect(timer, &QTimer::timeout, pp, &PrecisePolling::timeout);
timer->start();
timer->moveToThread(thread);
pp->moveToThread(thread);

thread->start(QThread::Priority::TimeCriticalPriority);

QObject::connect(pp, &PrecisePolling::nowtimeout, this, &MainWindow::timeoutt);


void MainWindow::timeoutt()
{
    const std::uint64_t ms = QDateTime::currentMSecsSinceEpoch();
    qDebug() << "GUI "<< ms - previousPollingTime;
    previousPollingTime = ms;
}
the worker class
void PrecisePolling::timeout()
{
    emit nowtimeout();
    const std::uint64_t ms = QDateTime::currentMSecsSinceEpoch();
    qDebug() << "THR "<< ms - previousPollingTime;
    previousPollingTime = ms;
}

output

THR  32
GUI  32
THR  33
GUI  33
THR  34
GUI  34
THR  32
GUI  32
THR  33
THR  33
THR  33
THR  34
THR  32
GUI  190
GUI  0
GUI  0
GUI  0
GUI  0
THR  34
GUI  9
THR  33