1
DotNet / Editing Text object while in a task seems to break stuff
« on: February 04, 2022, 05:51:00 am »
heyo, i was getting really strange behavior from sfml text
after changing DisplayedString while in a task, one of many issues could occur:
code:
after changing DisplayedString while in a task, one of many issues could occur:
- System.AccessViolationException when drawing the text
- System.AccessViolationException when trying to get its local/global bounds
- crash but with no error
- no crash but text is rendered with visual errors such as incorrect characters and or distorted characters
code:
using System;
using System.Threading;
using System.Threading.Tasks;
using SFML.Graphics;
using SFML.Window;
internal class Program {
public static RenderWindow Window;
public static void Main(string[] args) {
Window = new RenderWindow(new VideoMode(640, 480), "Test");
Window.SetFramerateLimit(60);
var textHolder = new TextHolder();
while (Window.IsOpen) {
Window.Clear();
Window.Draw(textHolder);
Window.Display();
}
}
}
internal class TextHolder : Drawable {
private Text _text;
public TextHolder() {
_text = new Text("Initial String", new Font("arial.ttf"));
Task.Run(() => {
Thread.Sleep(1000);
_text.DisplayedString = "ABCDEFGHIKLMNOPQRSTUVWXYZ";
Console.WriteLine(_text.GetLocalBounds().Width);
});
}
public void Draw(RenderTarget target, RenderStates states) {
target.Draw(_text);
}
}
sorry if a missed anything
using System.Threading;
using System.Threading.Tasks;
using SFML.Graphics;
using SFML.Window;
internal class Program {
public static RenderWindow Window;
public static void Main(string[] args) {
Window = new RenderWindow(new VideoMode(640, 480), "Test");
Window.SetFramerateLimit(60);
var textHolder = new TextHolder();
while (Window.IsOpen) {
Window.Clear();
Window.Draw(textHolder);
Window.Display();
}
}
}
internal class TextHolder : Drawable {
private Text _text;
public TextHolder() {
_text = new Text("Initial String", new Font("arial.ttf"));
Task.Run(() => {
Thread.Sleep(1000);
_text.DisplayedString = "ABCDEFGHIKLMNOPQRSTUVWXYZ";
Console.WriteLine(_text.GetLocalBounds().Width);
});
}
public void Draw(RenderTarget target, RenderStates states) {
target.Draw(_text);
}
}