Qtカード熱負荷-QPluginLoader実現

1839 ワード

前のC++メッセージフレームワーク-sigslotに基づいて、sigslot信号スロットを使用して自分のメッセージフレームワークを実現することについて述べました.これは比較的粗く、小さなフレームワークです.プログラムが徐々に大きくなると、機能のプラグイン化を考慮したり、一部のモジュールの動的ロードとアンインストールをサポートしたりする可能性があります.
機能のダイナミックロード、つまり私たちが普段言っているプラグイン化、プラグインはホットスワップをサポートします.
前の仕事で、ちょうどこの部分に触れたことがあります.以下はQtがdllをロードする方法で、dllをロードした後、PluginInterfaceインタフェースに変換してみることができます.変換に成功すれば、このdllが必要なプラグインであることを説明し、プラグインの初期化を行うことができます.
プラグインコードがメインプログラムと通信する必要がある場合は、プラグインを初期化するときに関連パラメータを渡すだけです.
void ReadPluginsInfo( const QString & pluginsDirPath /*= ""*/ )
{
    QString pluginsPath = pluginsDirPath;
    if (pluginsDirPath.isEmpty())
    {
        pluginsPath = QApplication::applicationDirPath();
    }
    QDir pluginsDir(pluginsPath);
    pluginsDir.cd("Plugins");

    QFileInfoList pluginsFile = pluginsDir.entryInfoList(QStringList() << "*.dll", QDir::Files);
    foreach(QFileInfo fileInfo, pluginsFile)
    {
        QPluginLoader loader(fileInfo.absoluteFilePath());
        bool isLoad = loader.isLoaded();
        QString info = loader.errorString();

        if (QObject * plugin = loader.instance())
        {
            if (PluginInterface * pinterface = dynamic_cast(plugin))
            {
                pinterface->install(PluginParam());//     
                m_lstPluginInterFace.push_back(pinterface);
            }  
        }
        else
        {
            qDebug() << loader.errorString();
        }
    }
}

上記のコード疑似コードは以下の通りです.
void ReadPluginsInfo( const QString & pluginsDirPath /*= ""*/ )
{
          
           dll
    foreach(dll  )
    {
          QPluginLoader       
        if (        )
        {
                 
        }
    }
}

転載先:https://www.cnblogs.com/swarmbees/p/10831111.html