folt-a / godot-nesink

Pseudo asynchronous scripting helpers for Godot 4.
MIT License
11 stars 1 forks source link

drainsにSignalを渡すとdisconnectedエラー #8

Closed folt-a closed 2 years ago

folt-a commented 2 years ago

環境 Windows10 Godot4.0 beta2

drainsに直接Signalを渡しSignalがemitされたときに、disconnectできないエラーが出ます。 処理自体は正常に完了しているように見えます。

    var res = await Async.wait_any([
        get_tree().create_timer(1).timeout,
        get_tree().create_timer(3).timeout,
    ])
    print("finished!")

image

Signalを直接ではなくAsync.from_signal()にするとうまくいくので、こちらを使った方が良いでしょうか?


res://addons/godot-nesink/NesinkronaFromSignalAsync.gdで、 CONNECT_ONE_SHOTの代わりに手動でシグナルをdisconnectするとエラーが消えますが、これが良い解決法なのかは分かりません!

func _init(
    signal_: Signal,
    signal_argc: int) -> void:

    assert(signal_argc <= MAX_SIGNAL_ARGC)

    match signal_argc:
        0: signal_.connect(_on_completed_0.bind(signal_))
        1: signal_.connect(_on_completed_1, CONNECT_ONE_SHOT)
        2: signal_.connect(_on_completed_2, CONNECT_ONE_SHOT)
        3: signal_.connect(_on_completed_3, CONNECT_ONE_SHOT)
        4: signal_.connect(_on_completed_4, CONNECT_ONE_SHOT)
        5: signal_.connect(_on_completed_5, CONNECT_ONE_SHOT)

func _on_completed_0(signal_:Signal) -> void:
    if is_pending:
        complete_release([])
    signal_.disconnect(_on_completed_0)
ydipeepo commented 2 years ago

前におっしゃってたのこういうのでしたか~! 確認したところ同じエラーでましたのでちょっと見てみます

await Async.from_signal(get_tree().create_timer(1.0).timeout).wait()
ydipeepo commented 2 years ago

9d08bab, 82d84a3 で修正しました

func _f(signal_: Signal) -> void:
    print(signal_.get_object()) # <Freed Object>
_f(get_tree().create_timer(1.0).timeout)

この問題私も困っていたんですが Signal にラップされた後 SceneTreeTimer が解放されてしまい (なぜか発火はするけど) 切断はできないで~てことみたいです。 このケース以外まだ確認してないですが SceneTreeTimer.timeout は解放されてても飛んでくるという特殊挙動だったのでそれ用のフロー設けて対処しました。

報告ありがとうございます。こちらに新しいバージョンを上げました:

folt-a commented 2 years ago

うまくいきました!ありがとうございます!!