This site is currently in read-only mode during migration to a new platform.
You cannot post questions, answers or comments, as they would be lost during the migration otherwise.
0 votes

For example, say I have this function:

var event_x_happened = false

func proceed_only_if_event_x_already_happened()
    if not event_x_happened:
        print("waiting for it...")
        yield(self, "event_x")
        event_x_happened = true
    print("now it happened for sure - continue")
    do_some_logic()

Is it guaranteed that the signal event_x will not be emitted on the line
print("waiting for it...")
and hence will get missed out by the line
yield(self, "event_x")
thus causing a deadlock?

Godot version 3.2.3
in Engine by (176 points)

If your code isn't multithreaded, while the GDScript VM is processing proceed_only_if_event_x_already_happened() it can't emit the signal the yield is waiting for, because it will only return from the function when reaching the yield (and eventually call your emit_signal() after that).

Thank you. That's what I wanted to know - that once a func starts executing, no other code will be executed before it finishes (other than the cases of yield or multithreading)

1 Answer

0 votes

It depends only how You are planning on checking this event.
signal will never be missed because of other lines, it is independent from lenght of code, it all happens too fast.

But if You somehow emit "event" before whole function is started, then it will be deadlocked. You have to time it properly.

by (8,188 points)
Welcome to Godot Engine Q&A, where you can ask questions and receive answers from other members of the community.

Please make sure to read Frequently asked questions and How to use this Q&A? before posting your first questions.
Social login is currently unavailable. If you've previously logged in with a Facebook or GitHub account, use the I forgot my password link in the login box to set a password for your account. If you still can't access your account, send an email to [email protected] with your username.