|
- /*
- ==============================================================================
-
- This file is part of the JUCE library.
- Copyright (c) 2016 - ROLI Ltd.
-
- Permission is granted to use this software under the terms of the ISC license
- http://www.isc.org/downloads/software-support-policy/isc-license/
-
- Permission to use, copy, modify, and/or distribute this software for any
- purpose with or without fee is hereby granted, provided that the above
- copyright notice and this permission notice appear in all copies.
-
- THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD
- TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
- FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT,
- OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
- USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- OF THIS SOFTWARE.
-
- -----------------------------------------------------------------------------
-
- To release a closed-source product which uses other parts of JUCE not
- licensed under the ISC terms, commercial licenses are available: visit
- www.juce.com for more information.
-
- ==============================================================================
- */
-
- #ifndef JUCE_ASYNCUPDATER_H_INCLUDED
- #define JUCE_ASYNCUPDATER_H_INCLUDED
-
-
- //==============================================================================
- /**
- Has a callback method that is triggered asynchronously.
-
- This object allows an asynchronous callback function to be triggered, for
- tasks such as coalescing multiple updates into a single callback later on.
-
- Basically, one or more calls to the triggerAsyncUpdate() will result in the
- message thread calling handleAsyncUpdate() as soon as it can.
- */
- class JUCE_API AsyncUpdater
- {
- public:
- //==============================================================================
- /** Creates an AsyncUpdater object. */
- AsyncUpdater();
-
- /** Destructor.
- If there are any pending callbacks when the object is deleted, these are lost.
- */
- virtual ~AsyncUpdater();
-
- //==============================================================================
- /** Causes the callback to be triggered at a later time.
-
- This method returns immediately, having made sure that a callback
- to the handleAsyncUpdate() method will occur as soon as possible.
-
- If an update callback is already pending but hasn't happened yet, calls
- to this method will be ignored.
-
- It's thread-safe to call this method from any number of threads without
- needing to worry about locking.
- */
- void triggerAsyncUpdate();
-
- /** This will stop any pending updates from happening.
-
- If called after triggerAsyncUpdate() and before the handleAsyncUpdate()
- callback happens, this will cancel the handleAsyncUpdate() callback.
-
- Note that this method simply cancels the next callback - if a callback is already
- in progress on a different thread, this won't block until the callback finishes, so
- there's no guarantee that the callback isn't still running when the method returns.
- */
- void cancelPendingUpdate() noexcept;
-
- /** If an update has been triggered and is pending, this will invoke it
- synchronously.
-
- Use this as a kind of "flush" operation - if an update is pending, the
- handleAsyncUpdate() method will be called immediately; if no update is
- pending, then nothing will be done.
-
- Because this may invoke the callback, this method must only be called on
- the main event thread.
- */
- void handleUpdateNowIfNeeded();
-
- /** Returns true if there's an update callback in the pipeline. */
- bool isUpdatePending() const noexcept;
-
- //==============================================================================
- /** Called back to do whatever your class needs to do.
-
- This method is called by the message thread at the next convenient time
- after the triggerAsyncUpdate() method has been called.
- */
- virtual void handleAsyncUpdate() = 0;
-
- private:
- //==============================================================================
- class AsyncUpdaterMessage;
- friend class ReferenceCountedObjectPtr<AsyncUpdaterMessage>;
- ReferenceCountedObjectPtr<AsyncUpdaterMessage> activeMessage;
-
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AsyncUpdater)
- };
-
-
- #endif // JUCE_ASYNCUPDATER_H_INCLUDED
|