forked from Mirrors/openclonk
Qt Editor: Make main loop calls more efficient
parent
fc10992ab7
commit
302fa5e362
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
Loading…
Reference in New Issue