概要
共有バリアント値を表します。
バリューオブジェクトは、VARオブジェクトへの参照が含まれ、その値を取得および設定することができます。
リスナーを設定することができ、値が変更された場合通知を受けることができます。
値のクラスは、共有、参照カウント基礎となるデータ・オブジェクトのラッパーです。
これは、複数を参照する値オブジェクトは、すべてのそれらのいずれかがそれを変更したとき、それらのすべてが通知されることを可能にする、データの同じ部分を参照することができます。
デフォルトのコンストラクタでValueを作成すると、単純なvarオブジェクトを包むラッパーとして機能しますが、ValueSourceのカスタムサブクラスを参照するValueを作成することによって、Valueを任意の種類の基礎データにマップできます。
重要な注意点!バリュークラスはスレッドセーフではありません!
複数のスレッドからアクセスする場合は、アクセスするコードの周りに独自の同期を使用する必要があります。
#リファレンスへのリンク
雑感
listenerクラスはGUI関連が初期化されていないと使えない模様。
(イベントハンドラマネージャのようなものが初期化されていないためアサートが出る。)
そのため検証にはGUIアプリケーションでプロジェクトを作成した。
検証
class listenerTest : public Value::Listener
{
public:
listenerTest() {}
virtual ~listenerTest() {}
virtual void valueChanged(Value& value)
{
juce::Logger::outputDebugString("valueChanged!");
}
};
listenerTest listener;
juce::Value v;
juce::Value v2;
//==============================================================================
int valuetest()
{
//リスナーの追加
v.addListener(&listener);
v = 11;
juce::Logger::outputDebugString("v(11) v=" + v.toString());
v.setValue(19);
juce::Logger::outputDebugString("v(18) v=" + v.toString());
v2.setValue(v);
juce::Logger::outputDebugString("v2(v) v=" + v.toString() + "v2=" + v.toString());
v = 11;
juce::Logger::outputDebugString("v(11) v=" + v.toString() + "v2=" + v.toString());
return 0;
}
v(11) v=11
v(18) v=19
v2(v) v=19v2=19
v(11) v=11v2=11
valueChanged!
#注意点
ValueのListenerは標準の状態だとメッセージスレッドのメッセージループから遅延配信されるためそれ以前にデストラクトされるとメッセージが発信されない。(AsyncUpdater)
また、GUIが初期化されていないとメッセージスレッドが作成されていないため機能しない。
(そのためサンプルではグローバル変数化しGUIアプリとして作成している。)
用途としてはコンポーネントなどのクラスに内包してGUIで使用することになると思うのでこの仕様でよさそうだが一応仕様は留意しておきたい。