mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-17 00:44:19 +00:00
141 lines
5.3 KiB
C++
141 lines
5.3 KiB
C++
/*
|
|
==============================================================================
|
|
|
|
This file is part of the JUCE library - "Jules' Utility Class Extensions"
|
|
Copyright 2004-10 by Raw Material Software Ltd.
|
|
|
|
------------------------------------------------------------------------------
|
|
|
|
JUCE can be redistributed and/or modified under the terms of the GNU General
|
|
Public License (Version 2), as published by the Free Software Foundation.
|
|
A copy of the license is included in the JUCE distribution, or can be found
|
|
online at www.gnu.org/licenses.
|
|
|
|
JUCE is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
|
|
------------------------------------------------------------------------------
|
|
|
|
To release a closed-source product which uses JUCE, commercial licenses are
|
|
available: visit www.rawmaterialsoftware.com/juce for more information.
|
|
|
|
==============================================================================
|
|
*/
|
|
|
|
#ifndef __JUCE_TIMESLICETHREAD_JUCEHEADER__
|
|
#define __JUCE_TIMESLICETHREAD_JUCEHEADER__
|
|
|
|
#include "juce_Thread.h"
|
|
#include "../containers/juce_Array.h"
|
|
#include "../core/juce_Time.h"
|
|
class TimeSliceThread;
|
|
|
|
//==============================================================================
|
|
/**
|
|
Used by the TimeSliceThread class.
|
|
|
|
To register your class with a TimeSliceThread, derive from this class and
|
|
use the TimeSliceThread::addTimeSliceClient() method to add it to the list.
|
|
|
|
Make sure you always call TimeSliceThread::removeTimeSliceClient() before
|
|
deleting your client!
|
|
|
|
@see TimeSliceThread
|
|
*/
|
|
class JUCE_API TimeSliceClient
|
|
{
|
|
public:
|
|
/** Destructor. */
|
|
virtual ~TimeSliceClient() {}
|
|
|
|
/** Called back by a TimeSliceThread.
|
|
|
|
When you register this class with it, a TimeSliceThread will repeatedly call
|
|
this method.
|
|
|
|
The implementation of this method should use its time-slice to do something that's
|
|
quick - never block for longer than absolutely necessary.
|
|
|
|
@returns Your method should return the number of milliseconds which it would like to wait before being called
|
|
again. Returning 0 will make the thread call again as soon as possible (after possibly servicing
|
|
other busy clients). If you return a value below zero, your client will be removed from the list of clients,
|
|
and won't be called again. The value you specify isn't a guaranteee, and is only used as a hint by the
|
|
thread - the actual time before the next callback may be more or less than specified.
|
|
You can force the TimeSliceThread to wake up and poll again immediately by calling its notify() method.
|
|
*/
|
|
virtual int useTimeSlice() = 0;
|
|
|
|
|
|
private:
|
|
friend class TimeSliceThread;
|
|
Time nextCallTime;
|
|
};
|
|
|
|
|
|
//==============================================================================
|
|
/**
|
|
A thread that keeps a list of clients, and calls each one in turn, giving them
|
|
all a chance to run some sort of short task.
|
|
|
|
@see TimeSliceClient, Thread
|
|
*/
|
|
class JUCE_API TimeSliceThread : public Thread
|
|
{
|
|
public:
|
|
//==============================================================================
|
|
/**
|
|
Creates a TimeSliceThread.
|
|
|
|
When first created, the thread is not running. Use the startThread()
|
|
method to start it.
|
|
*/
|
|
explicit TimeSliceThread (const String& threadName);
|
|
|
|
/** Destructor.
|
|
|
|
Deleting a Thread object that is running will only give the thread a
|
|
brief opportunity to stop itself cleanly, so it's recommended that you
|
|
should always call stopThread() with a decent timeout before deleting,
|
|
to avoid the thread being forcibly killed (which is a Bad Thing).
|
|
*/
|
|
~TimeSliceThread();
|
|
|
|
//==============================================================================
|
|
/** Adds a client to the list.
|
|
|
|
The client's callbacks will start after the number of milliseconds specified
|
|
by millisecondsBeforeStarting (and this may happen before this method has returned).
|
|
*/
|
|
void addTimeSliceClient (TimeSliceClient* client, int millisecondsBeforeStarting = 0);
|
|
|
|
/** Removes a client from the list.
|
|
|
|
This method will make sure that all callbacks to the client have completely
|
|
finished before the method returns.
|
|
*/
|
|
void removeTimeSliceClient (TimeSliceClient* client);
|
|
|
|
/** Returns the number of registered clients. */
|
|
int getNumClients() const;
|
|
|
|
/** Returns one of the registered clients. */
|
|
TimeSliceClient* getClient (int index) const;
|
|
|
|
//==============================================================================
|
|
/** @internal */
|
|
void run();
|
|
|
|
//==============================================================================
|
|
private:
|
|
CriticalSection callbackLock, listLock;
|
|
Array <TimeSliceClient*> clients;
|
|
TimeSliceClient* clientBeingCalled;
|
|
|
|
TimeSliceClient* getNextClient (int index) const;
|
|
|
|
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TimeSliceThread);
|
|
};
|
|
|
|
|
|
#endif // __JUCE_TIMESLICETHREAD_JUCEHEADER__
|