Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Creating themable Control nodes in thread results in an error #77764

Closed
KoBeWi opened this issue Jun 2, 2023 · 0 comments · Fixed by #78000
Closed

Creating themable Control nodes in thread results in an error #77764

KoBeWi opened this issue Jun 2, 2023 · 0 comments · Fixed by #78000

Comments

@KoBeWi
Copy link
Member

KoBeWi commented Jun 2, 2023

Godot version

4.1 621d68e

System information

Windows 10.0.19045 - Vulkan (Forward+) - dedicated NVIDIA GeForce GTX 1060 (NVIDIA; 30.0.15.1403) - Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz (8 Threads)

Issue description

When you create a Control node, that contains theme items, in a thread, e.g.

func _ready() -> void:
	var thread := Thread.new()
	thread.start(make_control)
	thread.wait_to_finish()

func make_control():
	var vb = VBoxContainer.new()
	add_child.call_deferred(vb)

it results in an error

Control::get_theme_constant: This function in this node can only be accessed from either the main thread or a thread group. Use call_deferred() instead.

The error comes from the var vb = VBoxContainer.new() line, so using call_deferred() is obviously not possible (unless we were able to await it somehow). The reason for error is that controls initialize their theme cache in NOTIFICATION_POSTINITIALIZE.

The code above is perfectly thread-safe and not allowing it makes it very inconvenient to create Control branches in thread (e.g. when you populate a list or something). Well, it does work, but the error results in a spam, so it should be prevented. Either we could remove the theme initialization from POSTINITIALIZE (the node is not inside tree yet, so not sure how much is it useful) or remove it, but only when the node is not in main thread.

Steps to reproduce

Run the code above.

Minimal reproduction project

N/A

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
2 participants