Я делаю считыватель памяти для игры, и у меня есть почти бесконечный поток, работающий в фоновом режиме, который проверяет позицию игроков, а затем отображает его на ярлыке с помощью Invoke(). Я отправлю только оскорбительную функцию. Это вызывает один и тот же поток каждые 10 мс.Windows Forms Invoke вызывает переполнение стека?
Invoke((MethodInvoker)delegate
{
lblCoords.Text = "Player Coordinates: < " + (int)x + ", " + (int)y + ", " + (int)z + " >";
});
После того, как код работает в течение примерно 20 минут, он будет врезаться и бросить StackOverflowException, связанные с этой функцией. Почему это происходит и как я могу остановить его? Очевидно, я мог бы просто прекратить использовать ярлык, чтобы показать это, хотя было бы более полезно узнать, почему это происходит для использования в будущем.
Так что это метод потока, кто-то сказал, что сразу создается несколько объектов, я предполагаю, что это потому, что это бесконечный цикл вызова UpdateThread() ... Если у этого есть цикл while вместо того, чтобы называть себя?
private void UpdateThread()
{
if (!running) return;
ReadPos();
Thread.Sleep(100);
UpdateThread();
}
private void ReadPos()
{
int pointerAddress = Memory.HexToDec(MemoryOffsets.PlayerPosAddress);
byte[] xVal = memory.PointerRead((IntPtr)pointerAddress, 4, MemoryOffsets.PlayerX);
byte[] yVal = memory.PointerRead((IntPtr)pointerAddress, 4, MemoryOffsets.PlayerY);
byte[] zVal = memory.PointerRead((IntPtr)pointerAddress, 4, MemoryOffsets.PlayerZ);
float x = BitConverter.ToSingle(xVal, 0);
float y = BitConverter.ToSingle(yVal, 0);
float z = BitConverter.ToSingle(zVal, 0);
Invoke((MethodInvoker)delegate
{
lblCoords.Text = "Player Coordinates: < " + (int)x + ", " + (int)y + ", " + (int)z + " >";
});
}
Ошибка программа показывала мне указывал на метод Invoke, поэтому я думал, что это было просто, что вызывает его. Поскольку для исключения есть около 20 минут, я не могу получить слишком много информации об этом.
StackOverflowException предполагает стек вызовов слишком глубоко, вероятно, какой-то неограниченной рекурсией. Я подозреваю, что проблема не в коде, который вы показываете, а в том, как вы его называете. Не могли бы вы разместить стек вызовов в момент исключения? это поможет. Вы можете отредактировать свой вопрос. – Theraot
Предполагаю, что вы снова и снова создаете экземпляры объекта. – DaveDev
Код, который вы показали, сам по себе не вызовет SOE. Вам нужно будет предоставить достаточно, чтобы воспроизвести проблему. – Servy