Fix not calling "handler.OnUpdate()" on time

This commit is contained in:
BruceChen 2022-08-30 18:17:39 +08:00
parent 1a90b6d942
commit a6b98de43f

View file

@ -172,51 +172,19 @@ namespace MinecraftClient.Protocol.Handlers
/// </summary> /// </summary>
private void Updater(object? o) private void Updater(object? o)
{ {
if (((CancellationToken)o!).IsCancellationRequested) if (((CancellationToken)o!).IsCancellationRequested)
return; return;
try try
{ {
Stopwatch stopWatch = new();
bool keepUpdating = true; while (!packetQueue.IsAddingCompleted)
Stopwatch stopWatch = new Stopwatch();
while (keepUpdating)
{ {
((CancellationToken)o!).ThrowIfCancellationRequested(); ((CancellationToken)o!).ThrowIfCancellationRequested();
stopWatch.Start();
keepUpdating = Update();
stopWatch.Stop();
int elapsed = stopWatch.Elapsed.Milliseconds;
stopWatch.Reset();
if (elapsed < 100)
Thread.Sleep(100 - elapsed);
}
}
catch (System.IO.IOException) { }
catch (SocketException) { }
catch (ObjectDisposedException) { }
catch (OperationCanceledException) { }
if (((CancellationToken)o!).IsCancellationRequested)
return;
handler.OnConnectionLost(ChatBot.DisconnectReason.ConnectionLost, "");
}
/// <summary>
/// Read data from the network. Should be called on a separate thread.
/// </summary>
/// <returns>FALSE if an error occured, TRUE otherwise.</returns>
private bool Update()
{
handler.OnUpdate(); handler.OnUpdate();
if (packetQueue.IsAddingCompleted) stopWatch.Start();
return false;
while (packetQueue.TryTake(out Tuple<int, Queue<byte>>? packetInfo)) while (packetQueue.TryTake(out Tuple<int, Queue<byte>>? packetInfo))
{ {
(int packetID, Queue<byte> packetData) = packetInfo; (int packetID, Queue<byte> packetData) = packetInfo;
@ -228,9 +196,31 @@ namespace MinecraftClient.Protocol.Handlers
List<byte> clone = packetData.ToList(); List<byte> clone = packetData.ToList();
handler.OnNetworkPacket(packetID, clone, login_phase, true); handler.OnNetworkPacket(packetID, clone, login_phase, true);
} }
}
return true; stopWatch.Stop();
if (stopWatch.Elapsed.Milliseconds >= 100)
{
stopWatch.Reset();
handler.OnUpdate();
}
stopWatch.Start();
}
stopWatch.Stop();
if (stopWatch.Elapsed.Milliseconds < 100)
Thread.Sleep(100 - stopWatch.Elapsed.Milliseconds);
stopWatch.Reset();
}
}
catch (System.IO.IOException) { }
catch (SocketException) { }
catch (ObjectDisposedException) { }
catch (OperationCanceledException) { }
if (((CancellationToken)o!).IsCancellationRequested)
return;
handler.OnConnectionLost(ChatBot.DisconnectReason.ConnectionLost, "");
} }
/// <summary> /// <summary>