LoginSignup
2
3

More than 5 years have passed since last update.

Juce Valueクラス

Last updated at Posted at 2017-12-21

概要

共有バリアント値を表します。

バリューオブジェクトは、VARオブジェクトへの参照が含まれ、その値を取得および設定することができます。
リスナーを設定することができ、値が変更された場合通知を受けることができます。

値のクラスは、共有、参照カウント基礎となるデータ・オブジェクトのラッパーです。
これは、複数を参照する値オブジェクトは、すべてのそれらのいずれかがそれを変更したとき、それらのすべてが通知されることを可能にする、データの同じ部分を参照することができます。

デフォルトのコンストラクタでValueを作成すると、単純なvarオブジェクトを包むラッパーとして機能しますが、ValueSourceのカスタムサブクラスを参照するValueを作成することによって、Valueを任意の種類の基礎データにマップできます。

重要な注意点!バリュークラスはスレッドセーフではありません!
複数のスレッドからアクセスする場合は、アクセスするコードの周りに独自の同期を使用する必要があります。

リファレンスへのリンク

classValue

雑感

listenerクラスはGUI関連が初期化されていないと使えない模様。
(イベントハンドラマネージャのようなものが初期化されていないためアサートが出る。)

そのため検証にはGUIアプリケーションでプロジェクトを作成した。

検証

ソース github

ソース

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で使用することになると思うのでこの仕様でよさそうだが一応仕様は留意しておきたい。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3