Estou desenvolvendo uma aplicação de console que executa periodicamente duas threads: uma para uma função tickEvent e outra para atualizar a tela do console. Atualmente, cada thread simplesmente bloqueia em uma verificação de condição até que seja hora do próximo ciclo.
Essa abordagem funciona, mas exige muito do processador e, para um aplicativo que executo em segundo plano, resulta em muito ruído dos meus ventiladores para ser prático.
Abordagem atual:
static void HandleTickBehaviour()
{
Stopwatch tickDuration = new(); //time tick starts
while (true)
{
tickDuration.Restart();
Tick.Invoke(ElapsedTicks); // invoke all tick event watchers
Profiler.CalcTime.Add(tickDuration.ElapsedMilliseconds); // how long it took for all tick event to run
long targetThreadDelay = (int)(Math.Max(25 - Math.Max(_deltaTime - 25, 0), 0) / 1000d * Stopwatch.Frequency); // how long to wait for next tick (25ms - delta time)
while (true) if (tickDuration.ElapsedTicks >= targetThreadDelay) break;
_deltaTime = tickDuration.ElapsedMilliseconds;
Profiler.TickTime.Add(_deltaTime);
ElapsedTicks++;
}
}
internal static void HandleConsoleRender()
{
Stopwatch frameDuration = new();
while (true)
{
frameDuration.Restart();
RenderConsole();
while (true) if (frameDuration.ElapsedTicks >= displayWindowsTickInterval) break;
Profiler.RenderTime.Add(frameDuration.ElapsedTicks);
}
}
Resultados do bloqueio de threads :
A outra abordagem que tentei implementar é usar thread.sleep()
, no entanto, como essas funções são chamadas a cada dois ms, o atraso para reativar o thread é simplesmente muito grande, e mesmo tentar levar isso em conta faz com que as atualizações aconteçam de forma imprevisível.