mvbg

VM_JOIN

VM_JOIN is a GBVM instruction used to pause the execution of the current thread until another specified thread has completed its execution.

Purpose: In multi-threaded programming, it’s often necessary to synchronize the execution of different threads. While VM_BEGINTHREAD allows threads to run concurrently, there are situations where one thread needs to wait for the results or completion of another. VM_JOIN provides this synchronization mechanism. It is crucial for:

Syntax:

VM_JOIN IDX

Usage Example: Waiting for a Loading Screen Thread

Imagine your game has a complex scene that takes time to load (e.g., loading assets, initializing actors). You might display a loading screen and spawn a separate thread to handle the loading process. Once the loading thread is complete, the main game thread can then proceed to display the loaded scene.

; In your main game script, before transitioning to a new scene:

; Variable to hold the loading thread handle
VAR_LOADING_THREAD_HANDLE:
  .R_INT16 0 ; Initialize to 0

; Display loading screen
VM_CALL DISPLAY_LOADING_SCREEN

; Push any arguments needed by the loading routine onto the stack
; (e.g., scene ID to load)
VM_PUSH_CONST SCENE_DUNGEON_ID

; Spawn the loading thread
VM_BEGINTHREAD BANK(LOAD_SCENE_ROUTINE), LOAD_SCENE_ROUTINE, VAR_LOADING_THREAD_HANDLE, 1
; (NARGS = 1 because we passed SCENE_DUNGEON_ID)

; Now, wait for the loading thread to finish
VM_JOIN VAR_LOADING_THREAD_HANDLE

; Once VM_JOIN returns, the loading is complete.
; Hide loading screen and proceed to the new scene.
VM_CALL HIDE_LOADING_SCREEN
VM_CALL START_DUNGEON_SCENE

; --- Loading Scene Routine (in a separate script/bank) ---
LOAD_SCENE_ROUTINE:
  ; Get the scene ID from the thread's stack
  VM_GET_TLOCAL VAR_SCENE_ID_TO_LOAD, 0

  ; Simulate loading time and asset loading based on VAR_SCENE_ID_TO_LOAD
  VM_IDLE 120 ; Simulate 2 seconds of loading
  ; ... actual asset loading, map initialization, etc. ...

  VM_TERMINATE ; Signal that this thread has completed

In this example, the main script calls DISPLAY_LOADING_SCREEN, then spawns LOAD_SCENE_ROUTINE in a new thread. Immediately after spawning, VM_JOIN VAR_LOADING_THREAD_HANDLE is called. This causes the main script to pause until LOAD_SCENE_ROUTINE executes VM_TERMINATE. Only then does the main script resume, hiding the loading screen and starting the new scene.

Analogy to other programming languages: This is directly analogous to thread.join() in Java, Python, or C++ (std::thread::join()). It’s a common pattern in concurrent programming to ensure that a parent thread waits for its child threads to complete their work before proceeding, often to collect results or to ensure proper cleanup and resource management.