Qt Editor: Make main loop calls more efficient

qteditor
Lukas Werling 2016-06-20 16:56:20 +02:00
parent fc10992ab7
commit 302fa5e362
3 changed files with 21 additions and 9 deletions

View File

@ -32,10 +32,16 @@ void C4AbstractApp::Run()
// with its events (zero timeout). The alternative (calling Qt's event handling from
// C4Console::Execute) is too slow, at least on Linux.
QTimer timer;
QObject::connect(&timer, &QTimer::timeout, [this]() {
QObject::connect(&timer, &QTimer::timeout, [this, &timer]() {
ScheduleProcs(0);
if (fQuitMsgReceived)
{
QApplication::quit();
return;
}
auto now = C4TimeMilliseconds::Now();
auto next_tick = GetNextTick(now);
timer.setInterval(Clamp(next_tick - now, 0, 36/1000));
});
timer.start();
QApplication::exec();

View File

@ -130,22 +130,27 @@ C4TimeMilliseconds StdSchedulerProc::GetNextTick(C4TimeMilliseconds tNow)
return C4TimeMilliseconds::PositiveInfinity;
}
C4TimeMilliseconds StdScheduler::GetNextTick(C4TimeMilliseconds tNow)
{
C4TimeMilliseconds tProcTick = C4TimeMilliseconds::PositiveInfinity;
for (auto proc : procs)
{
tProcTick = std::min(tProcTick, proc->GetNextTick(tNow));
}
return tProcTick;
}
bool StdScheduler::ScheduleProcs(int iTimeout)
{
// Needs at least one process to work properly
if (!procs.size()) return false;
// Get timeout
C4TimeMilliseconds tProcTick;
C4TimeMilliseconds tNow = C4TimeMilliseconds::Now();
for (auto i = 0u; i < procs.size(); i++)
C4TimeMilliseconds tProcTick = GetNextTick(tNow);
if (iTimeout == -1 || tNow + iTimeout > tProcTick)
{
auto proc = procs[i];
tProcTick = proc->GetNextTick(tNow);
if (iTimeout == -1 || tNow + iTimeout > tProcTick)
{
iTimeout = std::max<decltype(iTimeout)>(tProcTick - tNow, 0);
}
iTimeout = std::max<decltype(iTimeout)>(tProcTick - tNow, 0);
}
bool old = isInManualLoop;

View File

@ -263,6 +263,7 @@ public:
// needs to be called on thread tasks for this scheduler are meant to be run on
void StartOnCurrentThread();
C4TimeMilliseconds GetNextTick(C4TimeMilliseconds tNow);
bool ScheduleProcs(int iTimeout = 1000/36);
void UnBlock();