|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- /*
- ==============================================================================
-
- This file is part of the JUCE library.
- Copyright (c) 2022 - Raw Material Software Limited
-
- JUCE is an open source library subject to commercial or open-source
- licensing.
-
- The code included in this file is provided 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.
-
- JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
- EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
- DISCLAIMED.
-
- ==============================================================================
- */
-
- namespace juce
- {
-
- //==============================================================================
- /**
- 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.
-
- @tags{Events}
- */
- 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, after which a callback to the
- handleAsyncUpdate() method will be made by the message thread as
- soon as possible.
-
- If an update callback is already pending but hasn't happened yet, calling
- this method will have no effect.
-
- It's thread-safe to call this method from any thread, BUT beware of calling
- it from a real-time (e.g. audio) thread, because it involves posting a message
- to the system queue, which means it may block (and in general will do on
- most OSes).
- */
- 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)
- };
-
- } // namespace juce
|