Best way to wait/sleep/delay?


#1

Hi Everyone,

This is my first post here! I just started using JUCE and I am liking it so far. I used to be a full-time Tracktion user way before I started programming, so it is cool to see under the hood.

I am working on an audio processing program that I eventually want to make into a VST. For now, I am just trying to do extremely simple audio stuff. I have figured out how to listen to the default audio input and detect peaks over a user-set threshold. I have an AudioIODeviceCallback that also multiple inherits from ActionBroadcaster; when it finds a peak it broadcasts an action back to the main component.

I would like to display a big red square during a peak, but revert to a different color when the audio isn’t peaking. But the red square needs to show for long enough to see it, so I want it to delay for a little bit after the peaking is over.

What is the best way to make my code display the red for a duration, say 100ms, before going back to blank? Naturally, I don’t want to tie the CPU up in the action listening method for that whole duration.

Thanks!


#2

You can use

Time::waitForMillisecondCounter()

#3

waiting in callback procedure is the wrong approach (and it will block the message thread, nothing will be repainted, your app just freeze) , use the Timer class, a counter which will be decremented in the timerCallback and then change the colour when the time is over (or use some other mechanism)


#4

For anyone looking for quick, general answer for how to wait/sleep in Juce, this command will wait for one second

Time::waitForMillisecondCounter(Time::getMillisecondCounter() + 1000);

#5

A quick answer 5 years later? :smiley:

Rail


#6

Yes. The reason is, when I type “juce sleep” on Google, this thread is still the first one, so I think people might find it usefull :slight_smile: .


#7

…but it is still the wrong answer. Please read @chkn’s answer above. In 99% the answer is not sleep!

// in audio thread save the time, when the over occured:
Atomic<int64> over;

if (value > 1.0)
    over = Time::currentTimeMillis(); 

// in your editor's paint
if (processor.over + timeout > Time::currentTimeMillis())
    // draw your over
else
    // draw normal

You always want to return as quick as possible, so the event loop can do it’s work and call other events.

Hope that helps


#8

Thanks for you effort, but I’m not even trying to answer the OP. Reason explained above.


#9

Ok, to all people coming from google:
please avoid calling sleep/wait or delay method from Thread, if you don’t know how multi threading works (*).
Not relating to your answer :wink:

*) if you didn’t write/instanciate the thread. Don’t sleep in the message thread, don’t sleep in the audio thread. And especially if you don’t know, what’s that about: calling sleep is not the solution you are looking for.