📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
| 340行目: | 340行目: | ||
つまり、<code>QML_SINGLETON(<クラス名>, createSingleton)</code>のような形式となる。<br> | つまり、<code>QML_SINGLETON(<クラス名>, createSingleton)</code>のような形式となる。<br> | ||
<br> | <br> | ||
実装する場合には、静的メンバ変数を使用してシングルトンインスタンスを保持して、静的ファクトリー関数内でこのインスタンスを生成・返却する方法が一般的である。<br> | |||
<br> | <br> | ||
QMLエンジンがシングルトンを必要とするまで、実際のインスタンス生成を遅延させることができる。<br> | QMLエンジンがシングルトンを必要とするまで、実際のインスタンス生成を遅延させることができる。<br> | ||
これにより、リソースの効率的な利用が可能になる。<br> | これにより、リソースの効率的な利用が可能になる。<br> | ||
<br> | <br> | ||
※注意<br> | <u>※注意</u><br> | ||
スレッドセーフティに関しても考慮が必要である。<br> | <u>スレッドセーフティに関しても考慮が必要である。</u><br> | ||
複数のスレッドから同時にアクセスされる可能性がある場合、適切な同期メカニズムを実装することが重要となる。<br> | <u>複数のスレッドから同時にアクセスされる可能性がある場合、適切な同期メカニズムを実装することが重要となる。</u><br> | ||
<br> | <br> | ||
静的ファクトリー関数を使用することにより、デフォルトコンストラクタを持たないクラスでも、QMLシングルトンとして効果的に機能させることができる。<br> | |||
静的ファクトリー関数を通じて、インスタンスの生成・返却を細かく制御できるため、より柔軟性の高い設計が可能になる。<br> | 静的ファクトリー関数を通じて、インスタンスの生成・返却を細かく制御できるため、より柔軟性の高い設計が可能になる。<br> | ||
<br> | <br> | ||
| 357行目: | 357行目: | ||
#include <QObject> | #include <QObject> | ||
#include <QtQml/qqmlregistration.h> | #include <QtQml/qqmlregistration.h> | ||
#include <QMutex> | |||
#include <QMutexLocker> | |||
#include <memory> | |||
#include <QDebug> | #include <QDebug> | ||
| 366行目: | 369行目: | ||
private: | private: | ||
explicit MySingleton(QObject *parent = nullptr) : QObject(parent) {} | explicit MySingleton(QObject *parent = nullptr) : QObject(parent) {} | ||
static | static std::unique_ptr<MySingleton> instance; // インスタンスの生存期間を適切に管理する | ||
QMutex m_mutex; | |||
// コピーコンストラクタと代入演算子の無効化 | |||
MySingleton(const MySingleton&) = delete; | |||
MySingleton& operator=(const MySingleton&) = delete; | |||
public: | public: | ||
Q_INVOKABLE void doSomething() | Q_INVOKABLE void doSomething() | ||
{ | { | ||
// このメソッドが複数のスレッドから同時に呼ばれても、安全に実行される | |||
QMutexLocker locker(&m_mutex); | |||
qDebug() << "MySingleton is doing something!"; | qDebug() << "MySingleton is doing something!"; | ||
} | } | ||
| 378行目: | 388行目: | ||
Q_UNUSED(engine) | Q_UNUSED(engine) | ||
Q_UNUSED(scriptEngine) | Q_UNUSED(scriptEngine) | ||
// 複数のスレッドから同時に呼ばれても、インスタンスが1度だけ生成されることを保証する | |||
static QMutex mutex; | |||
QMutexLocker locker(&mutex); | |||
if (!instance) { | if (!instance) { | ||
instance | // インスタンスの生存期間を適切に管理する | ||
instance.reset(new MySingleton()); | |||
} | } | ||
return instance; | return instance.get(); | ||
} | } | ||
}; | }; | ||
MySingleton | // メモリリークを防いで、リソース管理を改善する | ||
std::unique_ptr<MySingleton> MySingleton::instance = nullptr; | |||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | <br> | ||