make example external_source_external_thread deterministic (#16574)

# Objective

- make example external_source_external_thread deterministic

## Solution

- Don't depend on real time
This commit is contained in:
François Mockers 2024-12-01 21:09:13 +01:00 committed by GitHub
parent 2309c07e8e
commit 4282c3fe40
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -5,14 +5,15 @@ use bevy::prelude::*;
use crossbeam_channel::{bounded, Receiver}; use crossbeam_channel::{bounded, Receiver};
use rand::{Rng, SeedableRng}; use rand::{Rng, SeedableRng};
use rand_chacha::ChaCha8Rng; use rand_chacha::ChaCha8Rng;
use std::time::{Duration, Instant};
fn main() { fn main() {
App::new() App::new()
.add_event::<StreamEvent>() .add_event::<StreamEvent>()
.add_plugins(DefaultPlugins) .add_plugins(DefaultPlugins)
.add_systems(Startup, setup) .add_systems(Startup, setup)
.add_systems(Update, (read_stream, spawn_text, move_text)) .add_systems(Update, (spawn_text, move_text))
.add_systems(FixedUpdate, read_stream)
.insert_resource(Time::<Fixed>::from_seconds(0.5))
.run(); .run();
} }
@ -25,7 +26,7 @@ struct StreamEvent(u32);
fn setup(mut commands: Commands) { fn setup(mut commands: Commands) {
commands.spawn(Camera2d); commands.spawn(Camera2d);
let (tx, rx) = bounded::<u32>(10); let (tx, rx) = bounded::<u32>(1);
std::thread::spawn(move || { std::thread::spawn(move || {
// We're seeding the PRNG here to make this example deterministic for testing purposes. // We're seeding the PRNG here to make this example deterministic for testing purposes.
// This isn't strictly required in practical use unless you need your app to be deterministic. // This isn't strictly required in practical use unless you need your app to be deterministic.
@ -33,12 +34,8 @@ fn setup(mut commands: Commands) {
loop { loop {
// Everything here happens in another thread // Everything here happens in another thread
// This is where you could connect to an external data source // This is where you could connect to an external data source
let start_time = Instant::now();
let duration = Duration::from_secs_f32(rng.gen_range(0.0..0.2));
while start_time.elapsed() < duration {
// Spinning for 'duration', simulating doing hard work!
}
// This will block until the previous value has been read in system `read_stream`
tx.send(rng.gen_range(0..2000)).unwrap(); tx.send(rng.gen_range(0..2000)).unwrap();
} }
}); });