Skip to content

Fixing script refresh and timing issues in Scratch projects

💡 Struggling with script timing and refresh issues? Don’t know how to debug custom block problems? 🚀 Get Help Now

ST

ScriptTiming_Expert

Posted on January 26, 2024 • Intermediate

⏱️ Script refresh stops working after first run

I’m working on a stock price display system that should:

  • Display stock prices in numbers
  • Change colors based on price values
  • Refresh every 1 second automatically

The Problem:

Everything works perfectly the first time when I press the green flag, but after that, the refreshing completely stops working. The script runs once and then never updates again.

I’m using custom blocks (“my blocks”) for the price display logic. Could this be causing the refresh issue? I have 4 different versions of similar custom blocks for different stock displays.

The refresh timing seems to break after the initial execution. Has anyone encountered similar issues with custom blocks and forever loops? 🤔

TD

TimingDebugger_Pro

Replied 1 hour later • ⭐ Best Answer

I can help you solve this @ScriptTiming_Expert! This is a classic timing and script architecture issue. The problem is likely in how you’re structuring your refresh loop and custom blocks. Let me show you the proper way to implement auto-refreshing systems! 🔧

🔍 Common Refresh Loop Problems

Here’s what typically goes wrong with refresh systems:

flowchart TD A[🚩 Green Flag Clicked] --> B[Run Custom Block] B --> C[Display Data] C --> D[Wait 1 Second] D --> E{Script Structure?} E -->|❌ Wrong Way| F[Script Ends] E -->|✅ Right Way| G[Forever Loop] F --> H[No More Updates] G --> I[Call Custom Block Again] I --> J[Update Display] J --> K[Wait 1 Second] K --> I style A fill:#e1f5fe style F fill:#ffebee style H fill:#ffebee style G fill:#e8f5e8 style I fill:#e8f5e8

🛠️ Step 1: Proper Refresh Loop Structure

The key is using a forever loop with proper timing:

    // WRONG - Script ends after first run
when flag clicked
update stock display
wait [1] seconds
// Script ends here!

// CORRECT - Continuous refresh
when flag clicked
forever
update stock display
wait [1] seconds
end
  

🎯 Step 2: Optimized Custom Block Design

Instead of 4 separate custom blocks, use one parameterized block:

    // Create one custom block with parameters
define update stock (stock id) (x pos) (y pos)
go to x: (x pos) y: (y pos)
set [current stock v] to (stock id)

// Get stock price (simulate with random for demo)
set [stock price v] to (pick random [100] to [500])

// Update display
say (join [$] (stock price)) for [0.1] seconds

// Change color based on price
if <(stock price) > [300]> then
set [color v] effect to [50] // Green
else
if <(stock price) > [200]> then
set [color v] effect to [0] // Normal
else
set [color v] effect to [-50] // Red
end
end
  

🚀 Step 3: Complete Stock Display System

Here’s a robust implementation that won’t break:

    // Main refresh loop
when flag clicked
set [refresh active v] to [true]
forever
if <(refresh active) = [true]> then
// Update all 4 stock displays
update stock [1] [-150] [100]
wait [0.1] seconds
update stock [2] [-50] [100]
wait [0.1] seconds
update stock [3] [50] [100]
wait [0.1] seconds
update stock [4] [150] [100]

// Wait before next refresh cycle
wait [1] seconds
else
wait [0.1] seconds
end
end

// Emergency stop for debugging
when [s v] key pressed
set [refresh active v] to [false]
say [Refresh stopped] for [2] seconds

// Resume refresh
when [r v] key pressed
set [refresh active v] to [true]
say [Refresh resumed] for [2] seconds
  

🔧 Step 4: Advanced Timing Control

For more sophisticated timing control:

    // Variable refresh rate system
when flag clicked
set [refresh interval v] to [1] // seconds
set [last update time v] to (timer)

forever
if <((timer) - (last update time)) ≥ (refresh interval)> then
// Time for update
broadcast [update all stocks v]
set [last update time v] to (timer)

// Dynamic refresh rate based on market volatility
if <(market volatility) > [0.5]> then
set [refresh interval v] to [0.5] // Faster updates
else
set [refresh interval v] to [2] // Slower updates
end
end
wait [0.1] seconds // Small delay to prevent lag
end
  

🐛 Step 5: Debugging Refresh Issues

Add debugging to identify where refresh breaks:

    // Debug version with status tracking
define update stock with debug (stock id) (x pos) (y pos)
say (join [Updating stock ] (stock id)) for [0.5] seconds
go to x: (x pos) y: (y pos)

// Add error checking
if <(stock id) > [4]> then
say [Error: Invalid stock ID!] for [2] seconds
stop [this script v]
end

// Continue with normal update
set [stock price v] to (item (stock id) of [Stock Prices v])
say (join [$] (stock price))

// Log successful update
change [update count v] by [1]
if <((update count) mod [10]) = [0]> then
say (join [Completed ] (update count)) for [1] seconds
end
  

⚡ Performance Tips

  • Avoid blocking operations: Don’t use “say for X seconds” in loops
  • Use efficient waits: Small wait times prevent script freezing
  • Limit custom block complexity: Keep blocks simple and fast
  • Add emergency stops: Always have a way to stop runaway loops

The main issue was likely missing the forever loop or having blocking operations that prevented the refresh cycle from continuing. This solution will give you reliable, continuous updates! ⏰✨

ST

ScriptTiming_Expert

Replied 25 minutes later

@TimingDebugger_Pro This is exactly what I needed! 🎉 You’re absolutely right - I was missing the forever loop. My script was running once and then ending.

The parameterized custom block approach is much cleaner than having 4 separate blocks. The debugging features will help me catch issues early too!

CB

CustomBlock_Master

Replied 45 minutes later

Great solution! 🎯 Here’s a pro tip for stock display systems - use broadcast messages for better organization:

    // Main controller
when flag clicked
forever
broadcast [refresh stocks v]
wait [1] seconds
end

// Each stock sprite responds
when I receive [refresh stocks v]
if <(my stock id) = [1]> then
update my display
end
  

This way each stock can update independently without blocking others! 📈

VB

Vibelf_Community

Pinned Message • Moderator

⏱️ Master Advanced Timing & Script Optimization

Excellent debugging discussion! For those building complex real-time systems and optimizing script performance, our community can help you implement:

  • 🔄 Advanced refresh algorithms
  • ⚡ Performance optimization techniques
  • 🎛️ Dynamic timing control systems
  • 🐛 Comprehensive debugging frameworks

📚 Related Timing Topics

Ready to master advanced timing and script optimization? Get personalized guidance from our expert tutors in the Vibelf app!